// WM_TIMERタイマーの処理 LRESULT CFuncKeyWnd::OnTimer( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // HWND hwnd, // handle of window for timer messages // UINT uMsg, // WM_TIMER message // UINT idEvent, // timer identifier // DWORD dwTime // current system time // return; if( NULL == GetHwnd() ){ return 0; } if( ::GetActiveWindow() != GetParentHwnd() && m_nCurrentKeyState != -1 ) { // 2002/06/02 MIK // 2006.12.20 ryoji 初回更新は処理する return 0; } int nIdx; // int nFuncId; int i; // novice 2004/10/10 /* Shift,Ctrl,Altキーが押されていたか */ nIdx = getCtrlKeyState(); /* ALT,Shift,Ctrlキーの状態が変化したか */ if( nIdx != m_nCurrentKeyState ){ m_nTimerCount = TIMER_CHECKFUNCENABLE + 1; /* ファンクションキーの機能名を取得 */ for( i = 0; i < _countof( m_szFuncNameArr ); ++i ){ // 2007.02.22 ryoji CKeyBind::GetFuncCode()を使う EFunctionCode nFuncCode = CKeyBind::GetFuncCode( (WORD)(((VK_F1 + i) | ((WORD)((BYTE)(nIdx))) << 8)), m_pShareData->m_Common.m_sKeyBind.m_nKeyNameArrNum, m_pShareData->m_Common.m_sKeyBind.m_pKeyNameArr ); if( nFuncCode != m_nFuncCodeArr[i] ){ m_nFuncCodeArr[i] = nFuncCode; if( 0 == m_nFuncCodeArr[i] ){ m_szFuncNameArr[i][0] = LTEXT('\0'); }else{ // Oct. 2, 2001 genta m_pcEditDoc->m_cFuncLookup.Funccode2Name( m_nFuncCodeArr[i], m_szFuncNameArr[i], _countof(m_szFuncNameArr[i]) - 1 ); } Wnd_SetText( m_hwndButtonArr[i], m_szFuncNameArr[i] ); } } } m_nTimerCount += TIMER_TIMEOUT; if( m_nTimerCount > TIMER_CHECKFUNCENABLE || nIdx != m_nCurrentKeyState ){ m_nTimerCount = 0; /* 機能が利用可能か調べる */ for( i = 0; i < _countof( m_szFuncNameArr ); ++i ){ if( IsFuncEnable( (CEditDoc*)m_pcEditDoc, m_pShareData, m_nFuncCodeArr[i] ) ){ ::EnableWindow( m_hwndButtonArr[i], TRUE ); }else{ ::EnableWindow( m_hwndButtonArr[i], FALSE ); } } } m_nCurrentKeyState = nIdx; return 0; }
/* Keybind メッセージ処理 */ INT_PTR CPropKeybind::DispatchEvent( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { WORD wNotifyCode; WORD wID; HWND hwndCtl; NMHDR* pNMHDR; static HWND hwndCombo; static HWND hwndFuncList; static HWND hwndKeyList; static HWND hwndCheckShift; static HWND hwndCheckCtrl; static HWND hwndCheckAlt; static HWND hwndAssignedkeyList; // static HWND hwndLIST_KEYSFUNC; static HWND hwndEDIT_KEYSFUNC; // int nLength; int nAssignedKeyNum; int nIndex; int nIndex2; int nIndex3; int i; int j; EFunctionCode nFuncCode; static WCHAR pszLabel[256]; switch( uMsg ){ case WM_INITDIALOG: /* ダイアログデータの設定 Keybind */ SetData( hwndDlg ); // Modified by KEITA for WIN64 2003.9.6 ::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam ); /* コントロールのハンドルを取得 */ hwndCombo = ::GetDlgItem( hwndDlg, IDC_COMBO_FUNCKIND ); hwndFuncList = ::GetDlgItem( hwndDlg, IDC_LIST_FUNC ); hwndAssignedkeyList = ::GetDlgItem( hwndDlg, IDC_LIST_ASSIGNEDKEYS ); hwndCheckShift = ::GetDlgItem( hwndDlg, IDC_CHECK_SHIFT ); hwndCheckCtrl = ::GetDlgItem( hwndDlg, IDC_CHECK_CTRL ); hwndCheckAlt = ::GetDlgItem( hwndDlg, IDC_CHECK_ALT ); hwndKeyList = ::GetDlgItem( hwndDlg, IDC_LIST_KEY ); // hwndLIST_KEYSFUNC = ::GetDlgItem( hwndDlg, IDC_LIST_KEYSFUNC ); hwndEDIT_KEYSFUNC = ::GetDlgItem( hwndDlg, IDC_EDIT_KEYSFUNC ); /* キー選択時の処理 */ // From Here Oct. 14, 2000 JEPRO わかりにくいので選択しないように変更 //Oct. 17, 2000 JEPRO 復活! // /* キーリストの先頭の項目を選択(リストボックス)*/ List_SetCurSel( hwndKeyList, 0 ); //Oct. 14, 2000 JEPRO ここをコメントアウトすると先頭項目が選択されなくなる ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); //Oct. 14, 2000 JEPRO ここはどっちでもいい?(わからん) // To Here Oct. 14, 2000 ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCombo ); ::SetTimer( hwndDlg, 1, 300, NULL ); // 2007.11.02 ryoji return TRUE; case WM_NOTIFY: pNMHDR = (NMHDR*)lParam; switch( pNMHDR->code ){ case PSN_HELP: // OnHelp( hwndDlg, IDD_PROP1P5 ); // Sept. 9, 2000 JEPRO 実際のID名に変更 OnHelp( hwndDlg, IDD_PROP_KEYBIND ); return TRUE; case PSN_KILLACTIVE: // MYTRACE( _T("Keybind PSN_KILLACTIVE\n") ); /* ダイアログデータの取得 Keybind */ GetData( hwndDlg ); return TRUE; //@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正 case PSN_SETACTIVE: m_nPageNum = ID_PROPCOM_PAGENUM_KEYBOARD; // 表示を更新する(マクロ設定画面でのマクロ名変更を反映) // 2007.11.02 ryoji nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); if( nIndex != LB_ERR ){ ::SendMessageAny( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); } if( nIndex2 != CB_ERR ){ ::SendMessageAny( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCombo ); if( nIndex3 != LB_ERR ){ List_SetCurSel( hwndFuncList, nIndex3 ); } } return TRUE; } break; case WM_COMMAND: wNotifyCode = HIWORD(wParam); /* 通知コード */ wID = LOWORD(wParam); /* 項目ID、 コントロールID、 またはアクセラレータID */ hwndCtl = (HWND) lParam; /* コントロールのハンドル */ switch( wNotifyCode ){ /* ボタン/チェックボックスがクリックされた */ case BN_CLICKED: switch( wID ){ case IDC_BUTTON_IMPORT: /* インポート */ /* Keybind:キー割り当て設定をインポートする */ Import( hwndDlg ); return TRUE; case IDC_BUTTON_EXPORT: /* エクスポート */ /* Keybind:キー割り当て設定をエクスポートする */ Export( hwndDlg ); return TRUE; case IDC_BUTTON_ASSIGN: /* 割付 */ nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); if( nIndex == LB_ERR || nIndex2 == CB_ERR || nIndex3 == LB_ERR ){ return TRUE; } nFuncCode = m_cLookup.Pos2FuncCode( nIndex2, nIndex3 ); // Oct. 2, 2001 genta i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i] = nFuncCode; ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_FUNC, LBN_SELCHANGE ), (LPARAM)hwndFuncList ); return TRUE; case IDC_BUTTON_RELEASE: /* 解除 */ nIndex = List_GetCurSel( hwndKeyList ); if( nIndex == LB_ERR ){ return TRUE; } nFuncCode = F_DEFAULT; i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i] = nFuncCode; ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_FUNC, LBN_SELCHANGE ), (LPARAM)hwndFuncList ); return TRUE; } break; /* BN_CLICKED */ } if( hwndCheckShift == hwndCtl || hwndCheckCtrl == hwndCtl || hwndCheckAlt == hwndCtl ){ switch( wNotifyCode ){ case BN_CLICKED: ChangeKeyList( hwndDlg ); return TRUE; } }else if( hwndKeyList == hwndCtl ){ switch( wNotifyCode ){ case LBN_SELCHANGE: nIndex = List_GetCurSel( hwndKeyList ); i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } nFuncCode = m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i]; // Oct. 2, 2001 genta // 2007.11.02 ryoji F_DISABLEなら未割付 if( nFuncCode == F_DISABLE ){ auto_strncpy( pszLabel, LSW(STR_PROPCOMKEYBIND_UNASSIGN), _countof(pszLabel) - 1 ); pszLabel[_countof(pszLabel) - 1] = L'\0'; }else{ m_cLookup.Funccode2Name( nFuncCode, pszLabel, 255 ); } Wnd_SetText( hwndEDIT_KEYSFUNC, pszLabel ); return TRUE; } }else if( hwndFuncList == hwndCtl ){ switch( wNotifyCode ){ case LBN_SELCHANGE: nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); nFuncCode = m_cLookup.Pos2FuncCode( nIndex2, nIndex3 ); // Oct. 2, 2001 genta /* 機能に対応するキー名の取得(複数) */ CNativeT** ppcAssignedKeyList; nAssignedKeyNum = CKeyBind::GetKeyStrList( /* 機能に対応するキー名の取得(複数) */ G_AppInstance(), m_Common.m_sKeyBind.m_nKeyNameArrNum, (KEYDATA*)m_Common.m_sKeyBind.m_pKeyNameArr, &ppcAssignedKeyList, nFuncCode, FALSE // 2007.02.22 ryoji デフォルト機能は取得しない ); /* 割り当てキーリストをクリアして値の設定 */ List_ResetContent( hwndAssignedkeyList ); if( 0 < nAssignedKeyNum){ for( j = 0; j < nAssignedKeyNum; ++j ){ /* デバッグモニタに出力 */ const TCHAR* cpszString = ppcAssignedKeyList[j]->GetStringPtr(); ::List_AddString( hwndAssignedkeyList, cpszString ); delete ppcAssignedKeyList[j]; } delete [] ppcAssignedKeyList; } return TRUE; } }else if( hwndCombo == hwndCtl){ switch( wNotifyCode ){ case CBN_SELCHANGE: nIndex2 = Combo_GetCurSel( hwndCombo ); /* 機能一覧に文字列をセット(リストボックス)*/ m_cLookup.SetListItem( hwndFuncList, nIndex2 ); // Oct. 2, 2001 genta return TRUE; } //@@@ 2001.11.08 add start MIK }else if( hwndAssignedkeyList == hwndCtl){ switch( wNotifyCode ){ case LBN_SELCHANGE: //case LBN_DBLCLK: { TCHAR buff[1024], *p; int ret; nIndex = List_GetCurSel( hwndAssignedkeyList ); auto_memset(buff, 0, _countof(buff)); ret = List_GetText( hwndAssignedkeyList, nIndex, buff); if( ret != LB_ERR ) { i = 0; p = buff; //SHIFT if( auto_memcmp(p, STR_SHIFT_PLUS, _tcslen(STR_SHIFT_PLUS)) == 0 ){ p += _tcslen(STR_SHIFT_PLUS); i |= _SHIFT; } //CTRL if( auto_memcmp(p, STR_CTRL_PLUS, _tcslen(STR_CTRL_PLUS)) == 0 ){ p += _tcslen(STR_CTRL_PLUS); i |= _CTRL; } //ALT if( auto_memcmp(p, STR_ALT_PLUS, _tcslen(STR_ALT_PLUS)) == 0 ){ p += _tcslen(STR_ALT_PLUS); i |= _ALT; } for(j = 0; j < m_Common.m_sKeyBind.m_nKeyNameArrNum; j++) { if( _tcscmp(m_Common.m_sKeyBind.m_pKeyNameArr[j].m_szKeyName, p) == 0 ) { List_SetCurSel( hwndKeyList, j); if( i & _SHIFT ) ::CheckDlgButton( hwndDlg, IDC_CHECK_SHIFT, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_SHIFT, BST_UNCHECKED ); //チェックをはずす if( i & _CTRL ) ::CheckDlgButton( hwndDlg, IDC_CHECK_CTRL, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_CTRL, BST_UNCHECKED ); //チェックをはずす if( i & _ALT ) ::CheckDlgButton( hwndDlg, IDC_CHECK_ALT, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_ALT, BST_UNCHECKED ); //チェックをはずす ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); // キー一覧の文字列も変更 ChangeKeyList( hwndDlg ); break; } } } return TRUE; } } //@@@ 2001.11.08 add end MIK } break; case WM_TIMER: // ボタンの有効/無効を切り替える // 2007.11.02 ryoji nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_ASSIGN ), !( LB_ERR == nIndex || nIndex2 == CB_ERR || nIndex3 == LB_ERR ) ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_RELEASE ), !( LB_ERR == nIndex ) ); break; case WM_DESTROY: ::KillTimer( hwndDlg, 1 ); // 2007.11.02 ryoji break; //@@@ 2001.02.04 Start by MIK: Popup Help case WM_HELP: { HELPINFO *p = (HELPINFO *)lParam; MyWinHelp( (HWND)p->hItemHandle, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 } return TRUE; /*NOTREACHED*/ //break; //@@@ 2001.02.04 End //@@@ 2001.11.07 Start by MIK: Context Menu Help //Context Menu case WM_CONTEXTMENU: MyWinHelp( hwndDlg, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; //@@@ 2001.11.07 End } return FALSE; }