现在的位置: 首页 > 综合 > 正文

VS MFC 菜单 添加快捷键

2013年10月28日 ⁄ 综合 ⁄ 共 1521字 ⁄ 字号 评论关闭

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;

}

抱歉!评论已关闭.