小可爱~ 发表于 2017-1-18 11:50

[mfc]如何给MFC的菜单项添加快捷键

本帖最后由 小可爱~ 于 2017-1-18 12:08 编辑

转载
我们一起分享,如何给MFC的菜单项添加快捷键。【程序在VC6.0编译环境下编译通过。(VS2010的编译环境大同小异)】
方法一:
1.程序演示环境
1.1新建一个【对话框(Dialog)】的程序。然后,New 一个菜单项。(你应该知道怎么New一个菜单项)
1.2然后,再在对话框的属性里面,找到那个【Menu】选项。关联那个 你刚才New的菜单,这样,菜单就被添加到对话框程序中来了。先看个图,再继续介绍。(如果你是在【单文档程序】下测试,那么第1步可以跳过,其他步骤都是一样的!!!)

http://images.cnitblog.com/blog/295207/201308/19221224-16a5a1c960c84e3db65d3046cea96986.jpg

继续看图---------------------- // 设置菜单项的文本信息和ID

http://images.cnitblog.com/blog/295207/201308/19221458-586c136e52ae492aa0872ac2044e2b33.jpg


2.新建一个加速键
2.1在【Insert(插入)】-->【Resource(资源)】里面,添加快捷键资源。其他不需要改变,尽量保持默认值。
2.2也可以再菜单栏空白的地方,点击右键,选择Resource,你就能看的下面那个Resource资源对话框了。啰嗦太多了。这都是基础,加油哦(我也是从空白开始学习的,而且,现在还在继续学习,这里只是和大家分享一些东西。)。下面进入正题。
2.3 注意了:加速键里面,ID是你的那个菜单项的ID,不是菜单的ID。我这里的菜单默认ID是IDR_MENU1,我添加的【保存】菜单项ID是IDM_SAVE。如下图,添加你想设置快捷键菜单项的ID,添加你自己设置的快捷键(key)。这步就完成了。看图。。。

http://images.cnitblog.com/blog/295207/201308/19221927-92795b1c7cc947c5a83481aedd0a6e7b.jpg


3.添加相关的代码
3.1在对话框类 C***Dlg.h文件,类定义中加入变量HACCEL hAccel;

http://images.cnitblog.com/blog/295207/201308/19222055-2d09fecddde9406d88635bc9d3c511c1.jpg

3.2.在对话框类C***Dlg.CPP文件中,的OnInitDialog函数中添加如下代码。// IDR_ACCELERATOR1 是加速键的IDhAccel = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
3.3 添加虚函数PreTranslateMessage(). // 点右击弹出你需要的对话框,选择添加虚函数,选择PreTranslateMessage// 截图已经写的很详细了。

http://images.cnitblog.com/blog/295207/201308/19222208-8a2b6be3d26243d4975d79c6957febe4.jpg

在PreTranslateMessage()函数里面添加下面的代码:   
if (::TranslateAccelerator(GetSafeHwnd(), hAccel, pMsg))            
            return true;
4.响应OnCommand消息

http://images.cnitblog.com/blog/295207/201308/19222312-feb9fcc063ef498ba04e1c14222601d0.jpg

在类向导(ClassWizard)里面,给那个菜单项添加COMMAND消息,然后点击Edit Code,进入你刚才添加的函数里面(我这里是OnSave函数)。
5.测试你的程序
http://images.cnitblog.com/blog/295207/201308/19222400-503f12864fd44d308254f39295f462a4.jpg


方法二:
1       声明热键消息处理函数原型         
  在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句:         
  LRESULT   OnHotKey(WPARAM   wParam,LPARAM   lParam);         
2.   消息与相应处理函数相关联         
  在.Cpp中加入消息映射宏,使消息与相应处理函数发生关系,   
            ON_MESSAGE(WM_HOTKEY,OnHotKey);         
3.   为方便以后的操作   
        预先在类中创建一个响应WM_CREATE和WM_DESTROY消息的函数   
            OnCreate()与OnDestroy()的框架
4.向系统登记热键         
  在OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为   
            Ctrl+Shift+A.         
  RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT, 'A ');         
  RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT, 'a ');         
  5.处理热键         
  在消息处理函数OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码   
  LRESULT   C****::OnHotKey(WPARAM   wParam,LPARAM   lParam)         
  if(wParam==1001||wParam==1002)         
  CWnd::SetForegroundWindow();//使得被激活窗口出现在前景         
  MessageBox( "Hello! ");         
                 //用户可在此添加代码         
  return   0;         
  6.程序运行完毕后解除热键         
  在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源.         
  UnRegisterHotKey(m_hWnd,1001);         
  UnRegisterHotKey(m_hWnd,1002);         
  7.编译并运行程序

在此,对原创作者的辛勤劳动表示感谢。我仅仅是整理了一下这些知识点而已。保护知识产权,转载请注明出处。欢迎共享。

原文地址
和这个

冥界3大法王 发表于 2017-1-18 12:13

每种语言都会搞点基本的之后做出来去调试自然就有感觉了。

那该怎么办 发表于 2017-1-18 13:13

把基础过一遍,这个基本没有什么问题。

kingdjh 发表于 2017-1-18 15:03

我想知道怎么给别人的MFC程序的某个按钮加一个快捷键
页: [1]
查看完整版本: [mfc]如何给MFC的菜单项添加快捷键