⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpropcomkeybind.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					{
						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 + -