MFC---给按钮加上快捷键
现在快捷键的使用已经很频繁了。快捷键可以使我们的操作变得更简单,更快捷。如何给自己的按钮加一个快捷键呢。
如下图:我们希望给我们的参照按钮加一个快捷键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---给按钮加上快捷键的更多相关文章
- JavaFX如何为按钮设置快捷键?
JavaFX为按钮设置快捷键的方式有很多,先说下常见的一种. 第一种: KeyCodeCombination kc1 = new KeyCodeCombination(KeyCode.W, KeyCo ...
- VS2010 MFC的按钮风格改变
改变VS2010 MFC的按钮风格 VS2010建的MFC工程按钮默认的风格类似VC6.0(直角矩形),如想美观按钮改为WIN7的按钮风格(圆角矩形),只需在代码中找到头文件"stdafx. ...
- MFC中为菜单或按钮添加快捷键功能
1.新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL ...
- 图文详解MFC程序设置菜单快捷键
原来觉得添加个快捷键就只要几分钟,上网搜索文章都写得很模糊, 只有这边文章不错. http://www.cplusplus.me/1263.html http://blog.sina.com.cn/s ...
- Winform button按钮设置快捷键
1)Text属性命名时后面&加键名,如:文件(&F) 2)添加一个ContextMenuStrip控件,同时在Items里添加一个项,并为项设置快捷键,把Visible设置为false ...
- MFC DialogBar 按钮灰色不响应
在MFC单文档加添加DialogBar,然后在DialogBar上添加按钮,会出现如下情况,单击无响应. 解决方案: 在 CSideDialogBar头文件和CPP文件里添加如下函数 afx_msg ...
- VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题
1.动态按钮的四种动作 1)正常 2)按下 3)滑过 4)失效 在MFC中,4个动作对应着四种位图bmp, 首先,将代表四种状态的位图加载入资源中,将对应的按钮设置为BitmapButton 第二,在 ...
- MFC动态按钮的创建及其消息响应(自定义消息)
动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针 ...
- MFC动态按钮的创建及其消息响应 和 自定义消息
原文链接: http://www.cnblogs.com/gaohongchen01/p/4046525.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC ...
随机推荐
- JS命名空间
命名冲突 全局变量会绑定到 window 上,不同的javascript文件如果使用了相同的全局变量,或者定义了相同名字就的顶层函数,都会造成命名冲突,并且很难被发现. 减少冲突的一个办法,把自己的所 ...
- jQuery—常用操作
一.jquery各版本变化 1.3:增加live(),为当前和将来增加的元素绑定事件 1.4:增加delegate().undelegate(),替代live(),可以遍历绑定 1.6:2个破坏性变更 ...
- Android Auto开发之一《开始学习Auto 》
共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...
- Linux下Steam中支持中文的办法
搜索过好几个解决方案,诸如添加skin等等,在我的ARCH机器上似乎都不行然后在搜索linux steam cjk时, 发现一个链接中有解决DOTA2显示中文不正确的问题,感觉可能有用,就参考着搞定了 ...
- linux下libevent安装
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz tar –xzvf libevent-1.4.13-stable.tar.gz ...
- Yii2.0 对的一些简单的操作
1: 此方法返回 ['name' => 'daxia'] 的所有数据: User::find()->where(['name' => 'daxia'])->all(); 2: ...
- ubuntu竖屏显示
xrandr -o left 向左旋转90度 xrandr -o right 向右旋转90度 xrandr -o inverted 上下翻转 xrandr -o normal 回到正常角
- 浅谈Android样式开发之shape
引言 在Android开发中我们很多情况都是使用图片来展示相关效果,今天我就来详细介绍下Android下使用Shape来进行简单UI的开发.一方面这些是Android开发的基础,另一方面这方面的知识可 ...
- windows7下Wamp安装php扩展imagick(转)
ImageMagick是一套功能强大.稳定而且免费的工具集和开发包,可以用来读.写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等 ...
- win10连vpn
1.首先卸载网络适配器下所有的WAN Miniport 2.打开命令提示符,输入:netsh interface ipv4 uninstall 卸载TCP/IPv4协议. 3.重启电脑后再次打开“命令 ...