转载自https://www.cnblogs.com/hungryvampire/p/5297927.html
MFC 控件添加热键 2014-12-24 14:28:47
标签:C++ MFC 控件 热键使用
给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函数中加载快捷键,如:
1 HACCEL m_hAcc=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
5. 重载函数PreTranslateMessage,使用类向导,重载虚函数PreTranslateMessage,如:
12345678910 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。
在对话框头文件中:
12 afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
afx_msg void OnDestroy();
在对话框CPP文件中:
1234 BEGIN_MESSAGE_MAP(CYourDlg, CDialog)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
ON_WM_DESTROY()
END_MESSAGE_MAP()
hotkey对应映射:
1234567 LRESULT CYourDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
if(wParam==IDC_XXX)
OnYourFunction();
//ToDo: add function
return 0;
}
注册热键:
1234 BOOL CYourDlg::OnInitDialog()
{
::RegisterHotKey(GetSafeHwnd(), IDC_XXX, MOD_ALT, 'D');//注册热键alt+D(D必须大写)
}
记得销毁:
1234 void CYourDlg::OnDestroy()
{
::UnregisterHotKey(GetSafeHwnd(),IDC_XXX);//销毁热键
}
另外一篇参考:http://lty2154216.blog.163.com/blog/static/17982629320117129491666/
MFC 控件添加热键
最新推荐文章于 2022-07-28 22:24:30 发布