现在快捷键的使用已经很频繁了。快捷键可以使我们的操作变得更简单,更快捷。如何给自己的按钮加一个快捷键呢。
    如下图:我们希望给我们的参照按钮加一个快捷键CTR + F。

不要以为在按钮的标题上加上F就行了,这只是给用户看的。 我们需要实现它,实现它有两种方法。先说方法一。
    我们可以这样想,我们截取用户的F按键,如果用户按了F按键的话,判断一下ctr键是否被按下,如果被按下的话,说明用户按了CTR + F ,然后我们去调相应的按钮事件就可以了。
   我们需要覆写CDialog类的 PreTranslateMessage(MSG* pMsg);这是一个虚方法。
  代码如下:

 BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
//先判断是否是键盘输入消息
if (pMsg-> message== WM_KEYDOWN) {
int nkeyDown = pMsg->wParam;
//ctr键的状态获取
BOOL bkeyState = GetKeyState(VK_CONTROL);
//0x46是F键的16进制表示
if (nkeyDown == 0x46 && bkeyState) {
//调相应的按钮事件
OnBnClickedButtonOpenfile();
}
}
return CDialog::PreTranslateMessage(pMsg);
}

这就完成了。

我们仔细看一下上面的代码会发现:只要满足CTR被按下的同时F键也被按下,那么就会触发这个事件。换句话说ctr 和F被同时按下的时候,其他键也被按下,也会触发该事件。如CTR + ALT + F也行。当然在要求不严格的情况下,这样已经OK了。
      有一天我发现CTR + F这个快捷键是许多软件的查找快捷键。当然我把ctr+ F定义成文件打开快捷键也没错。这有点看起来不伦不类。很多人认为CTR + F是查找快捷键 ,你把ctr+ F定义成文件打开快捷键,别人用的程序会不习惯的。
    后来我把快捷键定义成ctr + ALT + F。代码如下:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
//先判断是否是键盘输入消息
  if (pMsg-> message== WM_KEYDOWN) {
    int nkeyDown = pMsg->wParam;
//ctr键的状态获取
    BOOL bCtrkeyState = GetKeyState(VK_CONTROL);
BOOL bAltkeyState = GetKeyState(VK_MENU);
//0x46是F键的16进制表示
if (nkeyDown == 0x46 && bCtrkeyState && bAltkeyState ) {
//调相应的按钮事件
  OnBnClickedButtonOpenfile();
}
  }
  return CDialog::PreTranslateMessage(pMsg);
}

发现这样就OK了。后来我的leader告诉我CTR + ALT + F 按起来不方便,一只手按有点困难,你把CTR + ALT + F改成 ALT + F。
我认为这是很简单的一件事。我说很容易,我这样做的:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
//先判断是否是键盘输入消息
  if (pMsg-> message== WM_KEYDOWN) {
int nkeyDown = pMsg->wParam;
//alt键的状态获取
BOOL bAltkeyState = GetKeyState(VK_MENU);
//0x46是F键的16进制表示
     if (nkeyDown == 0x46 && bAltkeyState ) {
//调相应的按钮事件
  OnBnClickedButtonOpenfile();
}
  }
  return CDialog::PreTranslateMessage(pMsg);
}

  我发现失败了, 按alt + F 根本不会进入if (pMsg-> message== WM_KEYDOWN) { }这个块里。查了许多资料,发现alt很特殊,它的宏定义是
VK_MENU,其实它是MENU菜单的快捷键。
    alt + F是不是就实现不了呢?不是的,是可以实现的,这就是加快捷键的第二种方法。 
   我们可以用加速键表来添加快加键。
  打开资源视图,新建Accelerator资源。加入ALT + F快捷键。

这里的ID就是相应按钮的ID。定义一个成员变量HACCEL m_hAccel;
  在OnInitDialog()方法里进行初始化:

m_hAccel = LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
HACCEL hAccel = m_hAccel;
if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg))
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}

运行,发现OK。
   用加速键表来添加快加键是很方便的,不需要加很多代码。

MFC---给按钮加上快捷键的更多相关文章

  1. JavaFX如何为按钮设置快捷键?

    JavaFX为按钮设置快捷键的方式有很多,先说下常见的一种. 第一种: KeyCodeCombination kc1 = new KeyCodeCombination(KeyCode.W, KeyCo ...

  2. VS2010 MFC的按钮风格改变

    改变VS2010 MFC的按钮风格 VS2010建的MFC工程按钮默认的风格类似VC6.0(直角矩形),如想美观按钮改为WIN7的按钮风格(圆角矩形),只需在代码中找到头文件"stdafx. ...

  3. MFC中为菜单或按钮添加快捷键功能

    1.新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL ...

  4. 图文详解MFC程序设置菜单快捷键

    原来觉得添加个快捷键就只要几分钟,上网搜索文章都写得很模糊, 只有这边文章不错. http://www.cplusplus.me/1263.html http://blog.sina.com.cn/s ...

  5. Winform button按钮设置快捷键

    1)Text属性命名时后面&加键名,如:文件(&F) 2)添加一个ContextMenuStrip控件,同时在Items里添加一个项,并为项设置快捷键,把Visible设置为false ...

  6. MFC DialogBar 按钮灰色不响应

    在MFC单文档加添加DialogBar,然后在DialogBar上添加按钮,会出现如下情况,单击无响应. 解决方案: 在 CSideDialogBar头文件和CPP文件里添加如下函数 afx_msg ...

  7. VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题

    1.动态按钮的四种动作 1)正常 2)按下 3)滑过 4)失效 在MFC中,4个动作对应着四种位图bmp, 首先,将代表四种状态的位图加载入资源中,将对应的按钮设置为BitmapButton 第二,在 ...

  8. MFC动态按钮的创建及其消息响应(自定义消息)

    动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针 ...

  9. MFC动态按钮的创建及其消息响应 和 自定义消息

    原文链接: http://www.cnblogs.com/gaohongchen01/p/4046525.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC ...

随机推荐

  1. 利用scrapy和MongoDB来开发一个爬虫

    今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 在进行今天的任务之前我们需要安装二个框架,分别 ...

  2. ubuntu10.04编译安装LAMP

    ubuntu10.04编译安装LAMP以及简单wordpress的使用 : http://linuxme.blog.51cto.com/1850814/971631 一.源码安装LAMP 网上有一堆关 ...

  3. 08-linux 其他知识

    linux其他知识点 1-防火墙- iptables原理 2- 本部分属于一步一步学习大数据系列之 Linux 的章节,欢迎订阅更多文章 更多内容请参考:一步一步学习大数据系列介绍

  4. android App使用新浪微博sdk的使用总结

    问题1:注册app的key 问题2:在微博开放平台,我的应用中心中,设置应用的基本信息的时候其中有一项,是设置你的应用的签名,签名是需要在安卓设备上安装一个生成签名的app(这个app界面很丑,这点我 ...

  5. SQL Server中查询数据库及表的信息语句

    /* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...

  6. winform 跨线程操作控件

    当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程 ...

  7. 转:C++项目中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...

  8. 自动布局报错(两条连线冲突):Unable to simultaneously satisfy constraints

    这个报错有些长: Unable to simultaneously satisfy constraints.    Probably at least one of the constraints i ...

  9. js replaceAll

    js 全部替换: /** * 替换(所有) * @param str 要处理的字符串 * @param beRepStr 被替换的字符串 * @param toRepStr 最终生成的字符串 * @r ...

  10. [mark] Linux下如何批量删除空文件

    可以使用 xargs 命令来批量处理,代码如下: $ find . -name '*' -type f -size 0c | xargs rm -f