VS MFC 菜单 添加快捷键
①.资源视图点右键->添加资源->Accelerator
②.Accelerator与要绑定的菜单ID一致,这个菜单是总菜单的ID,不是某一子菜单项
③.在Accelerator里面设置快捷键,ID为对应的子菜单ID
④.在对话框类 C***Dlg.h文件,类定义中加入变量HACCEL hAccel;
在C***Dlg.cpp文件中的OnInitDialog()函数,添加一句:
hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(菜单资源ID));我这里的ID是MENU。
⑤.类视图->选定对话框类->下方的属性选项卡->上方的重写选项卡->找到PreTranslateMessage->右方的下拉框<添加>PreTranslateMessage
⑥.系统自动跳转到PreTranslateMessage(MSG* pMsg)函数,添加:
if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))
return true;
⑦.编写子菜单的响应函数:子菜单上点右键->添加事件处理程序->消息类型:COMMAND;类列表:选好指定的类
一种是直接与菜单项关联的加速键;另一种就是自定义的加速键.
第一种:首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称然后再设置你的快捷键.什么?下一步?在.h文件中加入一个 HACCEL hAccel;变量然后在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN));后面的参数改成加速键的资源文件名.
最后在PreTranslateMessage(MSG*pMsg) 中加入:
if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))
return true;
这样以后只要在Accelerator资源文件中添加快捷键就可以了
注意:添加快捷键的名字一定要与菜单名称一样这样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以了.
第二种:还是在资源文件Accelerator中添加快捷键资源 ID自己定义一个.然后再设置你的快捷键.下一步...就是在.h文件中定义一个快捷键对象
HACCEL m_hAccel;
然后在.cpp文件中初始
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
IDR_ACCELERATOR1为你的加速资源名称.注意不是刚刚定义的加速键ID.
再添加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;
}