对于这个问题, 大家应该都不陌生, 写于此只是进行了归纳总结, 算是一个备忘吧
定义快捷方式有下面几种方法:
1. 对于菜单 (MENU) 或者按钮(BUTTON)
直接在菜单或按钮的标题中, 包含 & X 即可, 这里 X 是任意字符键
示例: Tool 菜单项的标题可以写作:"&Tool" 或者 "工具(&T)", 这样就可以直接用 ALT+T 直接调用该菜单项的功能
2. 对菜单(MENU)
菜单的另一种快捷键的定义方式是组合键或者虚拟键, 如 Ctrl+O 表示打开文件, 或 F5 表示运行等
示例: 在 File 菜单项的 Open 字菜单项的标题可以写作:"&Open\tCtrl+O", 这样我们既可以用 ALT+O 或 Ctrl+O 来直接调用菜单项的功能
3. 另一种方式定义快捷键的就是自定义加速键
首先在资源文件 Accelerator 中添加快捷键资源 ID 选择你要关联菜单项的名称然后再设置你的快捷键
在. h 文件中加入一个 HACCEL hAccel;
变量然后在 OnInitDialog 或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN 为加速键的资源文件名
最后在 PreTranslateMessage(MSG* pMsg) 中加入:
- if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))
- return true;
这样 以后只要在 Accelerator 资源文件中添加快捷键就可以了
注意: 添加快捷键的名字一定要与菜单名称一样 这样才能响应. 现在只需要在此菜单项中加入 OnCommand 消息的处理就可以了.
4. 第二种自定义加速键的方法
还是在资源文件 Accelerator 中添加快捷键资源 ID 自己定义一个. 然后再设置你的快捷键.
在. h 文件中定义一个快捷键对象 HACCEL m_hAccel;
变量然后在 OnInitDialog 或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN 为加速键的资源文件名
再添加 PreTranslateMessage 消息处理 在里面加入以下代码:
- // 保存快捷键被启用
- if(m_hAccel != NULL)
- {
- if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
- return TRUE;
- }
再添加 OnCommand 消息处理 加入以下代码:
- // 响应加速键
- switch(LOWORD(wParam))
- {
- case SHOW_DIAL0G: // 加速键 ID
- //... 添加处理语句
- break;
- case SHOW_DIALOG_02: // 加速键 ID
- //... 添加处理语句
- break;
- }
这种方式可以任意调用加速键
5. 菜单添加全局快捷键, 以对话框程序为例:
在 OnInitDialog 中添加注册热键的代码:
- RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2 键
- RegisterHotKey(GetSafeHwnd(),1002,MOD_ALT,'1');//Alt+1 键
在
- BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
- ...
- END_MESSAGE_MAP()
中添加 WM_HOTKEY 的消息映射:
ON_MESSAGE(WM_HOTKEY,&CXXXDlg::OnHotKey)// 快捷键消息映射手动加入
在头文件中添加 OnHotKey 的声明:
- protected:
- afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);// 手动加入.
CPP 中 OnHotKey 的实现代码:
- // 相应快捷键的消息映射
- LRESULT CXXXDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
- {
- if(wParam ==1001)
- {
- MessageBox("热键 F2 已经按下!");
- // 这里可以加上你按钮要执行的操作, 或者直接调用按钮映射的消息函数
- }
- else if (wParam==1002)
- {
- MessageBox("热键 ALT+1 已经按下!");
- }
- return 0;
- }
关闭对话框时使用
- UnregisterHotKey(GetSafeHwnd(),1001);// 注销 F2 键
- UnregisterHotKey(GetSafeHwnd(),1002);// 注销 Alt+1 键
注销热键.
7. 按钮添加局部快捷键可以直接在按钮的标题中用 &+'X' 即可, 则按下 Ctrl + 'x' 即按下此按钮, 起到快捷键的作用, 另外还可以学习菜单添加局部快捷键的第二种方式, 在 PreTranslateMessage 中添加处理函数, 譬如:
- BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
- {
- // TODO: Add your specialized code here and/or call the base class
- BOOL bHandledMsg = FALSE;
- switch (pMsg->message)
- {
- case WM_KEYDOWN:
- {
- switch (pMsg->wParam)
- {
- case VK_ESCAPE://ESC 键
- bHandledMsg = TRUE;
- break;
- case 13:// 回车
- bHandledMsg = TRUE;
- break;
- default: break;
- } // switch (pMsg->wParam)
- }
- break;
- default: break;
- } // switch (pMsg->message)
- return (bHandledMsg ? TRUE : CDialog::PreTranslateMessage(pMsg));
- }
来源: http://www.bubuko.com/infodetail-2982292.html