📄 cpropcomkeybind.cpp
字号:
{
i = 0;
p = buff;
//SHIFT
if( memcmp(p, STR_SHIFT_PLUS, strlen(STR_SHIFT_PLUS)) == 0 ){
p += strlen(STR_SHIFT_PLUS);
i |= _SHIFT;
}
//CTRL
if( memcmp(p, STR_CTRL_PLUS, strlen(STR_CTRL_PLUS)) == 0 ){
p += strlen(STR_CTRL_PLUS);
i |= _CTRL;
}
//ALT
if( memcmp(p, STR_ALT_PLUS, strlen(STR_ALT_PLUS)) == 0 ){
p += strlen(STR_ALT_PLUS);
i |= _ALT;
}
for(j = 0; j < m_nKeyNameArrNum; j++)
{
if( strcmp(m_pKeyNameArr[j].m_szKeyName, p) == 0 )
{
::SendMessage( hwndKeyList, LB_SETCURSEL, (WPARAM)j, (LPARAM)0);
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 ); //チェックをはずす
::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList );
// キー一覧の文字列も変更
p5_ChangeKeyList( hwndDlg );
break;
}
}
}
return TRUE;
}
}
//@@@ 2001.11.08 add end MIK
}
break;
//@@@ 2001.02.04 Start by MIK: Popup Help
case WM_HELP:
{
HELPINFO *p = (HELPINFO *)lParam;
::WinHelp( (HWND)p->hItemHandle, m_szHelpFile, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids );
}
return TRUE;
/*NOTREACHED*/
//break;
//@@@ 2001.02.04 End
//@@@ 2001.11.07 Start by MIK: Context Menu Help
//Context Menu
case WM_CONTEXTMENU:
::WinHelp( hwndDlg, m_szHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids );
return TRUE;
//@@@ 2001.11.07 End
}
return FALSE;
}
/* ダイアログデータの設定 p5 */
void CPropCommon::SetData_p5( HWND hwndDlg )
{
HWND hwndCombo;
HWND hwndKeyList;
int i;
/* 機能種別一覧に文字列をセット(コンボボックス)*/
hwndCombo = ::GetDlgItem( hwndDlg, IDC_COMBO_FUNCKIND );
m_cLookup.SetCategory2Combo( hwndCombo ); // Oct. 2, 2001 genta
#if 0
for( i = 0; i < nsFuncCode::nFuncKindNum; ++i ){
::SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)nsFuncCode::ppszFuncKind[i] );
}
#endif
/* 種別の先頭の項目を選択(コンボボックス)*/
::SendMessage( hwndCombo, CB_SETCURSEL, (WPARAM)0, (LPARAM)0 ); //Oct. 14, 2000 JEPRO JEPRO 「--未定義--」を表示させないように大元 Funcode.cpp で変更してある
/* キー一覧に文字列をセット(リストボックス)*/
hwndKeyList = ::GetDlgItem( hwndDlg, IDC_LIST_KEY );
for( i = 0; i < m_nKeyNameArrNum; ++i ){
::SendMessage( hwndKeyList, LB_ADDSTRING, 0, (LPARAM)m_pKeyNameArr[i].m_szKeyName );
}
return;
}
/* ダイアログデータの取得 p5 */
int CPropCommon::GetData_p5( HWND hwndDlg )
{
//@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正
// m_nPageNum = ID_PAGENUM_KEYBOARD;
return TRUE;
}
/*! p5: キーリストをチェックボックスの状態に合わせて更新する */
void CPropCommon::p5_ChangeKeyList( HWND hwndDlg){
HWND hwndKeyList;
int nIndex;
int nIndexTop;
int i;
char pszLabel[256];
char szKeyState[64];
hwndKeyList = ::GetDlgItem( hwndDlg, IDC_LIST_KEY );
nIndex = ::SendMessage( hwndKeyList, LB_GETCURSEL, 0, 0 );
nIndexTop = ::SendMessage( hwndKeyList, LB_GETTOPINDEX, 0, 0 );
strcpy( szKeyState, "" );
i = 0;
if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){
i |= _SHIFT;
strcat( szKeyState, "Shift+" );
}
if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){
i |= _CTRL;
strcat( szKeyState, "Ctrl+" );
}
if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){
i |= _ALT;
strcat( szKeyState, "Alt+" );
}
/* キー一覧に文字列をセット(リストボックス)*/
::SendMessage( hwndKeyList, LB_RESETCONTENT, 0, 0 );
for( i = 0; i < m_nKeyNameArrNum; ++i ){
wsprintf( pszLabel, "%s%s", szKeyState, m_pKeyNameArr[i].m_szKeyName );
::SendMessage( hwndKeyList, LB_ADDSTRING, 0, (LPARAM)pszLabel );
}
::SendMessage( hwndKeyList, LB_SETCURSEL, nIndex, 0 );
::SendMessage( hwndKeyList, LB_SETTOPINDEX, nIndexTop, 0 );
::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList );
}
/* p5:キー割り当て設定をインポートする */
void CPropCommon::p5_Import_KeySetting( HWND hwndDlg )
{
CDlgOpenFile cDlgOpenFile;
char szPath[_MAX_PATH + 1];
HFILE hFile;
// char szLine[1024];
// int i;
char pHeader[STR_KEYDATA_HEAD_LEN + 1];
short nKeyNameArrNum; /* キー割り当て表の有効データ数 */
KEYDATA pKeyNameArr[100]; /* キー割り当て表 */
HWND hwndCtrl;
char szInitDir[_MAX_PATH + 1];
strcpy( szPath, "" );
strcpy( szInitDir, m_pShareData->m_szIMPORTFOLDER ); /* インポート用フォルダ */
/* ファイルオープンダイアログの初期化 */
cDlgOpenFile.Create(
m_hInstance,
hwndDlg,
"*.key",
szInitDir
);
if( !cDlgOpenFile.DoModal_GetOpenFileName( szPath ) ){
return;
}
/* ファイルのフルパスを、フォルダとファイル名に分割 */
/* [c:\work\test\aaa.txt] → [c:\work\test] + [aaa.txt] */
::SplitPath_FolderAndFile( szPath, m_pShareData->m_szIMPORTFOLDER, NULL );
strcat( m_pShareData->m_szIMPORTFOLDER, "\\" );
hFile = _lopen( szPath, OF_READ );
if( HFILE_ERROR == hFile ){
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"ファイルを開けませんでした。\n\n%s", szPath
);
return;
}
if( STR_KEYDATA_HEAD_LEN != _lread( hFile, pHeader, STR_KEYDATA_HEAD_LEN ) ||
sizeof( nKeyNameArrNum ) != _lread( hFile, &nKeyNameArrNum, sizeof( nKeyNameArrNum ) ) ||
sizeof( pKeyNameArr ) != _lread( hFile, pKeyNameArr, sizeof( pKeyNameArr ) ) ||
0 != memcmp( pHeader, STR_KEYDATA_HEAD, STR_KEYDATA_HEAD_LEN )
){
_lclose( hFile ); //@@@ 2001.11.07 add MIK
//@@@ 2001.11.07 add start MIK
{
FILE *fp;
int i, j, cnt, kc, n, an;
char buff[1024], name[1024], szFuncNameJapanese[256], s[1024], *p, *q;
if( (fp = fopen( szPath, "r" )) == NULL )
{
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"ファイルを開けませんでした。\n\n%s", szPath
);
return;
}
if( fgets(buff, sizeof(buff), fp) != NULL
&& memcmp(buff, STR_KEYDATA_HEAD2, strlen(STR_KEYDATA_HEAD2)) == 0
&& fgets(buff, sizeof(buff), fp) != NULL )
{
cnt = sscanf(buff, "Count=%d", &an);
nKeyNameArrNum = an;
if( cnt == 1 && an >= 0 && an <= 100 )
{
for(i = 0; i < 100; i++)
{
name[0] = '\0';
if( fgets(buff, sizeof(buff), fp) == NULL ) break;
for(j = strlen(buff) - 1; j >= 0; j--){
if( buff[j] == '\n' || buff[j] == '\r' ) buff[j] = '\0';
}
cnt = sscanf(buff, "KeyBind[%03d]=%04x,%s",
&n,
&kc,
s,
name);
if( cnt != 3 ) break;
if( i != n ) break;
pKeyNameArr[i].m_nKeyCode = kc;
p = s;
for(j = 0; j < 8; j++)
{
q = strstr(p, ",");
if( !q )
break;
*q = '\0';
//機能名を数値に置き換える。(数値の機能名もあるかも)
//@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一
// n = CMacro::GetFuncInfoByName(m_hInstance, p, szFuncNameJapanese);
n = CSMacroMgr::GetFuncInfoByName(m_hInstance, p, szFuncNameJapanese);
if( n == -1 )
{
if( *p >= '0' && *p <= '9' )
{
n = atol(p);
}
else
{
n = 0;
}
}
pKeyNameArr[i].m_nFuncCodeArr[j] = n;
p = q + 1;
}
if( j != 8 ) break;
strcpy(pKeyNameArr[i].m_szKeyName, p);
}
if( i == 100 )
{
fclose(fp);
goto ToMaster;
}
}
}
fclose(fp);
}
//@@@ 2001.11.07 add end MIK
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"キー設定ファイルの形式が違います。\n\n%s", szPath
);
return;
}
_lclose( hFile );
ToMaster: //@@@ 2001.11.07 add MIK
/* データのコピー */
m_nKeyNameArrNum = nKeyNameArrNum;
memcpy( m_pKeyNameArr, pKeyNameArr, sizeof( pKeyNameArr ) );
// CShareData::SetKeyNames( m_pShareData ); /* キー名称のセット */
// /* ダイアログデータの設定 p5 */
// SetData_p5( hwndDlg );
//@@@ 2001.11.07 modify start MIK: 機能に割り当てられているキー一覧を更新する。
hwndCtrl = ::GetDlgItem( hwndDlg, IDC_LIST_KEY );
::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndCtrl );
hwndCtrl = ::GetDlgItem( hwndDlg, IDC_LIST_FUNC );
::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_FUNC, LBN_SELCHANGE ), (LPARAM)hwndCtrl );
//@@@ 2001.11.07 modify end MIK
return;
}
/* p5:キー割り当て設定をエクスポートする */
void CPropCommon::p5_Export_KeySetting( HWND hwndDlg )
{
CDlgOpenFile cDlgOpenFile;
char szPath[_MAX_PATH + 1];
// HFILE hFile; //@@@ 2001.11.07 del MIK
// char szLine[1024];
// int i;
// char pHeader[STR_KEYDATA_HEAD_LEN + 1];
// short nKeyNameArrNum; /* キー割り当て表の有効データ数 */
// KEYDATA pKeyNameArr[100]; /* キー割り当て表 */
char szInitDir[_MAX_PATH + 1];
strcpy( szPath, "" );
strcpy( szInitDir, m_pShareData->m_szIMPORTFOLDER ); /* インポート用フォルダ */
/* ファイルオープンダイアログの初期化 */
cDlgOpenFile.Create(
m_hInstance,
hwndDlg,
"*.key",
szInitDir
);
if( !cDlgOpenFile.DoModal_GetSaveFileName( szPath ) ){
return;
}
/* ファイルのフルパスを、フォルダとファイル名に分割 */
/* [c:\work\test\aaa.txt] → [c:\work\test] + [aaa.txt] */
::SplitPath_FolderAndFile( szPath, m_pShareData->m_szIMPORTFOLDER, NULL );
strcat( m_pShareData->m_szIMPORTFOLDER, "\\" );
#if 0 //@@@ 2001.11.07 del start MIK
hFile = _lcreat( szPath, 0 );
if( HFILE_ERROR == hFile ){
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"ファイルを開けませんでした。\n\n%s", szPath
);
return;
}
if( STR_KEYDATA_HEAD_LEN != _lwrite( hFile, (LPCSTR)STR_KEYDATA_HEAD, STR_KEYDATA_HEAD_LEN ) ||
sizeof( m_nKeyNameArrNum ) != _lwrite( hFile, (LPCSTR)&m_nKeyNameArrNum, sizeof( m_nKeyNameArrNum ) ) ||
sizeof( m_pKeyNameArr ) != _lwrite( hFile, (LPCSTR) m_pKeyNameArr, sizeof( m_pKeyNameArr ) )
){
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"ファイルの書き込みに失敗しました。\n\n%s", szPath
);
_lclose( hFile ); //@@@ 2001.11.09 add MIK
return;
}
_lclose( hFile );
#endif //@@@ 2001.11.07 del end MIK
//@@@ 2001.11.07 add start MIK: テキスト形式で保存
{
FILE *fp;
int i, j;
char szFuncName[256], szFuncNameJapanese[256], *p;
if( (fp = fopen( szPath, "w" )) == NULL )
{
::MYMESSAGEBOX( hwndDlg, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
"ファイルを開けませんでした。\n\n%s", szPath
);
return;
}
fprintf(fp, "%s\n", STR_KEYDATA_HEAD2);
fprintf(fp, "Count=%d\n", m_nKeyNameArrNum);
for(i = 0; i < 100; i++)
{
fprintf(fp, "KeyBind[%03d]=%04x", i, m_pKeyNameArr[i].m_nKeyCode);
for(j = 0; j < 8; j++)
{
//@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一
// p = CMacro::GetFuncInfoByID(m_hInstance, m_pKeyNameArr[i].m_nFuncCodeArr[j], szFuncName, szFuncNameJapanese);
p = CSMacroMgr::GetFuncInfoByID(m_hInstance, m_pKeyNameArr[i].m_nFuncCodeArr[j], szFuncName, szFuncNameJapanese);
if( p ) {
fprintf(fp, ",%s", p);
}
else {
fprintf(fp, ",%d", m_pKeyNameArr[i].m_nFuncCodeArr[j]);
}
}
fprintf(fp, ",%s\n", m_pKeyNameArr[i].m_szKeyName);
}
fclose(fp);
}
//@@@ 2001.11.07 add end MIK
return;
}
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -