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 ...
随机推荐
- 关于SQL的相关笔记【长期更新,只发一帖】
场景[1]多表联查时,主表与关联表同时与同一张(第三张表)有关联,类似三角恋关系- - 涉及表: HOUSE:记录了房屋信息 ROOMS:记录了房间信息 HOUSE_STATUS:记录了状态信息的中文 ...
- ios相同版本升级
公司新发布ios,因为各种错误以及审核不通过造成app未能上传,而app在提交的时候不能上传相同的版本号,造成app还没有正式的上传上传已经将版本号升级到1.0.6 解决方法: 在Xcode上,查看项 ...
- latex均方极限符号l.i.m在lyx下的输入方法
$\mathop{l.i.m}\limits_{x\to +\infty}$ 命令说明: 1.指定数学环境$$ 2.\mathop{l.i.m}指数学符号自定义为l.i.m 3.\limits_{x\ ...
- asp.net反向代理
https://www.codeproject.com/Articles/18490/Reverse-Proxy-in-C-NET-v https://www.codeproject.com/Arti ...
- mvc添加多条数据到数据库
from : http://www.th7.cn/Program/net/201502/387849.shtml mvc的视图太强大了,个人刚刚接触.(初级菜鸟,懂的不多,往大神们指点)需求是,客户点 ...
- Android 只开启一个Activity实例
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...
- python 多环境安装
1.pyenv 安装 curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer ...
- eclipse常用快捷键
1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...
- Format 函数示例
Format 函数示例本示例显示用 Format 函数做格式化输出的不同用法.对于日期分隔号(/),时间分隔号(:),以及 AM/ PM 等文本而言,其真正的显示格式会因计算机上的国际标准不同而有所差 ...
- web自动化工具-开篇
web自动化工具-开篇 最近几年,前端技术风一样的速度迭代更新,各种框架工具雨后春笋般涌现,作为一个平凡的开发者,也只能在洪流中沉沉浮浮,微不足道,以前前端叫做切图仔.美工,如今改了称号叫前端工程师, ...