C:\home\SVGCats_src\src\InputIntDlg.cpp
1|// InputIntDlg.cpp : インプリメンテーション ファイル 2|// 3| 4|#include "mixer_precomp.h" 5|#ifdef USES_MXP_AUTOINC 6| #include "SVGCat.ah" 7|#endif 8| 9|#include <imm.h> 10| 11| 12|#ifdef _DEBUG 13|#define new DEBUG_NEW 14|#undef THIS_FILE 15|static char THIS_FILE[] = __FILE__; 16|#endif 17| 18|///////////////////////////////////////////////////////////////////////////// 19|// CInputIntDlg ダイアログ 20| 21| 22|CInputIntDlg::CInputIntDlg(CWnd* pParent /*=NULL*/) 23| : CDialog(CInputIntDlg::IDD, pParent) 24|{ 25| //{{AFX_DATA_INIT(CInputIntDlg) 26| m_Msg = _T(""); 27| m_Value = 0; 28| //}}AFX_DATA_INIT 29| m_bSetAtCursor = true; 30| m_XY.x = 0; m_XY.y = 0; 31| m_PenInputPanel = NULL; 32|} 33| 34| 35|void CInputIntDlg::DoDataExchange(CDataExchange* pDX) 36|{ 37| CDialog::DoDataExchange(pDX); 38| //{{AFX_DATA_MAP(CInputIntDlg) 39| DDX_Control(pDX, IDC_Spin, m_Spin); 40| DDX_Control(pDX, IDC_Value, m_ValueCtrl); 41| DDX_Text(pDX, IDC_Msg, m_Msg); 42| DDX_Text(pDX, IDC_Value, m_Value); 43| DDX_Control(pDX, IDC_Value2, m_Value2Ctrl); 44| //}}AFX_DATA_MAP 45|} 46| 47| 48|BEGIN_MESSAGE_MAP(CInputIntDlg, CDialog) 49| //{{AFX_MSG_MAP(CInputIntDlg) 50| ON_EN_CHANGE(IDC_Value, OnChangeValue) 51| ON_WM_ACTIVATE() 52| //}}AFX_MSG_MAP 53|END_MESSAGE_MAP() 54| 55|BEGIN_EVENTSINK_MAP(CInputIntDlg, CDialog) 56| //{{AFX_EVENTSINK_MAP(CInputIntDlg) 57| ON_EVENT(CInputIntDlg, IDC_Value2, 1 /* Change */, OnChangeValue2, VTS_NONE) 58| ON_EVENT(CInputIntDlg, IDC_Value2, 4 /* KeyUp */, OnKeyUpValue2, VTS_PI4 VTS_I2) 59| //}}AFX_EVENTSINK_MAP 60|END_EVENTSINK_MAP() 61| 62| 63|///////////////////////////////////////////////////////////////////////////// 64|// CInputIntDlg メッセージ ハンドラ 65| 66| 67|BOOL CInputIntDlg::OnInitDialog() 68|{ 69| CDialog::OnInitDialog(); 70| 71| CString s; 72| RECT rect; 73| POINT point; 74| int w, h; 75| int scr_w = GetSystemMetrics( SM_CXFULLSCREEN ); 76| int scr_h = GetSystemMetrics( SM_CYFULLSCREEN ); 77| 78| 79| /* ペン入力パネルを設定する */ 80| if ( m_PenInputPanel != NULL ) { 81| BSTR s; 82| HRESULT hr; 83| 84| hr = m_PenInputPanel->put_AttachedEditWindow( (LONG_PTR)m_Value2Ctrl.GetHwnd() ); 85| if ( hr != 0 ) error(); 86| 87| s = SysAllocString( OLESTR("DIGIT") ); 88| hr = m_PenInputPanel->put_Factoid( s ); 89| SysFreeString( s ); 90| if ( hr != 0 ) error(); 91| 92| hr = m_PenInputPanel->EnableTsf( VARIANT_TRUE ); 93| if ( hr != 0 ) error(); 94| 95| hr = m_PenInputPanel->put_AutoShow( VARIANT_FALSE ); 96| if ( hr != 0 ) error(); 97| 98| hr = m_PenInputPanel->put_HorizontalOffset( -40 ); 99| if ( hr != 0 ) error(); 100| hr = m_PenInputPanel->put_VerticalOffset( 47 ); 101| if ( hr != 0 ) error(); 102| } 103| 104| 105| /* テキストボックスの初期化をする */ 106| if ( m_PenInputPanel == NULL ) { 107| m_ValueCtrl.SetFocus(); 108| m_ValueCtrl.GetWindowText( s ); 109| m_ValueCtrl.SetSel( 0, s.GetLength() ); 110| } 111| else { 112| char ss[16]; 113| 114| sprintf( ss, "%d", m_Value ); 115| m_Value2Ctrl.SetText( ss ); 116| m_Value2Ctrl.SetFocus(); 117| m_Value2Ctrl.SetSelStart( 0 ); 118| m_Value2Ctrl.SetSelLength( strlen(ss) ); 119| } 120| 121| m_Spin.SetBuddy( &m_ValueCtrl ); 122| m_Spin.SetRange32( m_Min, m_Max ); 123| 124| GetWindowRect( &rect ); 125| if ( m_bSetAtCursor ) { 126| GetCursorPos( &point ); 127| point.x += 0; point.y += 80; 128| } 129| else { 130| point.x = m_XY.x; point.y = m_XY.y; 131| } 132| w = rect.right - rect.left; h = rect.bottom - rect.top; 133| rect.left = point.x - w / 2; rect.right = rect.left + w; 134| rect.top = point.y - h / 2; rect.bottom = rect.top + h; 135| if ( rect.right >= scr_w ) { rect.left -= rect.right - scr_w; rect.right = scr_w; } 136| if ( rect.bottom >= scr_h ) { rect.top -= rect.bottom - scr_h; rect.bottom = scr_h; } 137| if ( rect.left < 0 ) { rect.right += -rect.left; rect.left = 0; } 138| if ( rect.top < 0 ) { rect.bottom += -rect.top; rect.top = 0; } 139| MoveWindow( &rect ); 140| 141| ImmAssociateContext( m_ValueCtrl.m_hWnd, NULL ); /* 日本語入力を不可にする, imm.h, imm32.lib */ 142| ImmAssociateContext( m_Value2Ctrl.m_hWnd, NULL ); 143| 144| m_ValueCtrl.ShowWindow( m_PenInputPanel == NULL ? SW_SHOW : SW_HIDE ); 145| m_Value2Ctrl.ShowWindow( m_PenInputPanel == NULL ? SW_HIDE : SW_SHOW ); 146| 147| return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります 148| // 例外: OCX プロパティ ページの戻り値は FALSE となります 149|} 150| 151| 152|void CInputIntDlg::OnChangeValue() 153|{ 154| if ( m_PenInputPanel != NULL && ::GetFocus() == m_ValueCtrl.m_hWnd ) { 155| if ( m_PenInputPanel != NULL ) { 156| CString s; 157| 158| m_ValueCtrl.GetWindowText( s ); 159| m_Value2Ctrl.SetText( s ); 160| } 161| } 162|} 163| 164|void CInputIntDlg::OnChangeValue2() 165|{ 166| if ( m_PenInputPanel != NULL && ::GetFocus() == (HWND)m_Value2Ctrl.GetHwnd() ) { 167| if ( m_PenInputPanel != NULL ) { 168| CString s; 169| 170| s = m_Value2Ctrl.GetText(); 171| m_ValueCtrl.SetWindowText( s ); 172| } 173| } 174|} 175| 176| 177|void CInputIntDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 178|{ 179| CDialog::OnActivate(nState, pWndOther, bMinimized); 180| 181| if ( nState == WA_ACTIVE || nState == WA_CLICKACTIVE ) { 182| if ( m_PenInputPanel != NULL ) { 183| HRESULT hr; 184| 185| m_Value2Ctrl.SetFocus(); 186| 187| hr = m_PenInputPanel->put_Visible( VARIANT_TRUE ); 188| if ( hr != 0 ) return; /* コントロールが準備できていない */ 189| } 190| } 191|} 192| 193|void CInputIntDlg::OnOK() 194|{ 195| if ( m_PenInputPanel != NULL ) { 196| VARIANT_BOOL busy; 197| CString s; 198| 199| m_PenInputPanel->CommitPendingInput(); 200| for (;;) { 201| m_PenInputPanel->get_Visible( &busy ); 202| if ( ! busy ) break; 203| Sleep(50); 204| } 205| 206| s = m_Value2Ctrl.GetText(); 207| m_ValueCtrl.SetWindowText( s ); 208| } 209| 210| CDialog::OnOK(); 211|} 212| 213|void CInputIntDlg::OnKeyUpValue2(long FAR* pKey, short ShiftKey) 214|{ 215| CString s; 216| 217| s = m_Value2Ctrl.GetText(); 218| m_ValueCtrl.SetWindowText( s ); 219|} 220| 221|BOOL CInputIntDlg::PreTranslateMessage(MSG* pMsg) 222|{ 223| if ( pMsg->message == WM_KEYDOWN ) { 224| if ( pMsg->wParam == '\r' ) { 225| m_ValueCtrl.SetFocus(); /* これをしないと IPenInputPanel でしばらく固まる */ 226| this->PostMessage( WM_COMMAND, IDOK ); 227| return TRUE; 228| } 229| } 230| 231| return CDialog::PreTranslateMessage(pMsg); 232|} 233| 234|