给MFC中的控件添加我们想要的控件热键,在动手之前,必须清楚,热键分为local的和global的, 其中local的职能在当前程序有焦点(被激活)时有效,而global的,则无论什么时候都有效,测试local的要优先于global的,就是如果当前激活窗口的快捷键与未激活窗口的快捷键重叠,当前激活窗口优先响应。另外还包括menu,button。
自然而然,创建热键的方法也有多种,不同的创建方法创建的热键作用范围不一定相同。应该根据需求合理的选择自己的方法。
方法一:
打开对话框资源,选择指定控件的属性-->在caption项中你定义的名字后添加(&Y)。这样就可以实现热键。其中Y表示你要制定的快捷按键,我选的是Y,按下ALT+Y即可执行这个控件。
该方式热键只有当FOCUS在控件上时才起作用,算是局部热键。
方法二:
1. 在资源视图中添加资源,选择"Accelerator"选项新建即可;
2. 打开新建的文件夹下的"IDR_ACCELERATOR1"中编辑,其中包括ID、修饰符、键、类型。ID中选择你要添加快捷键的菜单、按钮的ID编号,修饰符中选择你是否要使用组合键,如:Alt、Alt+Shift等等,键中选择你要使用什么样的虚拟键码,类型中选择VK形式或者是ASCII形式。
3. 在你的对话框的头文件中添加快捷键变量,如HACCEL m_hAcc;
4. 在你的对话框的源文件的OnInitDialog函数中加载快捷键,如:
HACCEL m_hAcc=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
5. 重载函数PreTranslateMessage,使用类向导,重载虚函数PreTranslateMessage,如:
BOOL CVideoMonitorDlg::PreTranslateMessage(MSG* pMsg) { if (WM_KEYFIRST<=pMsg->message&&pMsg->message<= WM_KEYLAST) { HACCEL hAccel=m_hAcc; if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) return TRUE; } return CDialogEx::PreTranslateMessage(pMsg); }
6. 通过以上5个步骤基本上即可对工程中的菜单或者按钮添加热键。
方法三:
使用WM_HOTKEY。
在对话框头文件中:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam); afx_msg void OnDestroy();
在对话框CPP文件中:
BEGIN_MESSAGE_MAP(CYourDlg, CDialog) ON_MESSAGE(WM_HOTKEY,OnHotKey) ON_WM_DESTROY() END_MESSAGE_MAP()
hotkey对应映射:
LRESULT CYourDlg::OnHotKey(WPARAM wParam,LPARAM lParam) { if(wParam==IDC_XXX) OnYourFunction(); //ToDo: add function return 0; }
注册热键:
BOOL CYourDlg::OnInitDialog() { ::RegisterHotKey(GetSafeHwnd(), IDC_XXX, MOD_ALT, ‘D‘);//注册热键alt+D(D必须大写) }
记得销毁:
void CYourDlg::OnDestroy() { ::UnregisterHotKey(GetSafeHwnd(),IDC_XXX);//销毁热键 }
另外一篇参考:http://lty2154216.blog.163.com/blog/static/17982629320117129491666/
原文地址:http://3994129.blog.51cto.com/3984129/1595104