MFC中按钮对于键盘回车和空格响应,引发的问题
在调试写的代码的时候,碰到一个“很奇怪的"现象。因为进度的原因,当时就是当成一个异常输入进行了处理。现在空闲下来,重现了问题现象。现象是:在一个弹出窗口中,按键”enter“和”space“关闭对话框,对话框已经按照我以前的博客文章(https://blog.csdn.net/yishang44/article/details/99680673)描述的处理过了。在一个很偶然的启发下才发现问题。弹出框大概是这个样子的,两个按钮会选择性显示和隐藏。
当按钮都隐藏的时候,就会重现现象。为了便于显示,两个按钮的响应函数对了对应的标记。
在两个按钮都显示的时候,按键”enter“和”space“输入实际上响应的是按钮的单击消息,因为我在响应函数中调用了关闭对话框函数,就关闭了对话框。
void CDlgTestPath::OnBnClickedButton1()
{AfxMessageBox("按钮1");CDialogEx::OnCancel();
}
但是,这里就出现了一个新的疑惑,按钮是被隐藏了的,难道不应该屏蔽掉点击响应?!
实际上,当你隐藏按钮时候,鼠标的点击或者其他的(非”enter“和”space“)输入都是不响应的。在查看MSDN中按钮样式的说明,而一般情况,常规意义上说的按钮基本都会具有下面的属性。
而在默认的配置里面,VS2010会把对话框的输入焦点默认设置在按钮上,相关的属性如下:
对话框获取输入焦点的时候,基本的都是指定在按钮上的,特别如下面的情况的时候。这个时候,即便你把按钮隐藏,输入焦点也是在按钮上的,因为静态框默认是不接受输入焦点的。
所以,这个时候,”enter“和”space“的按键实际响应的是焦点状态的输入。现象虽类似,但原因却不同。解决方法就有很直观的两种的方法了。
第一种,将对话框的焦点修改到静态框上,如下图修改静态框属性。
第二种,就是修改按钮类对于”enter“和”space“按键响应。这个可以参考对话框的处理方式,或者直接参考CMFCButton类的方式,即创建你自己的按钮基类。创建控件基类可以参考我以前的文章https://blog.csdn.net/yishang44/article/details/99680673。CMFCButton中处理方式如下:
BOOL CMFCButton::PreTranslateMessage(MSG* pMsg)
{if (m_pToolTip->GetSafeHwnd() != NULL){if (pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP || pMsg->message == WM_MOUSEMOVE){m_pToolTip->RelayEvent(pMsg);}}if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN && CMFCPopupMenu::GetActiveMenu() == NULL){CWnd* pParent = GetParent();if (pParent != NULL){pParent->SendMessage( WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM) m_hWnd);return TRUE;}}if (pMsg->message == WM_KEYDOWN && m_bAutoCheck && GetParent() != NULL){switch (pMsg->wParam){case VK_SPACE:if (m_bCheckButton){m_bChecked = !m_bChecked;RedrawWindow();CWnd* pWndParent = GetParent();ASSERT_VALID(pWndParent);::SendMessage(pWndParent->GetSafeHwnd(), WM_COMMAND, MAKELONG(::GetWindowLong(m_hWnd, GWL_ID), BN_CLICKED), (LPARAM) m_hWnd);return TRUE ;}break;case VK_UP:case VK_LEFT:if (CheckNextPrevRadioButton(FALSE)){return TRUE;}break;case VK_DOWN:case VK_RIGHT:if (CheckNextPrevRadioButton(TRUE)){return TRUE;}break ;}}return CButton::PreTranslateMessage(pMsg);
}
MFC中按钮对于键盘回车和空格响应,引发的问题相关推荐
- MFC中动态创建控件以及事件响应实现方法
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- vue 项目中使用键盘回车或空格按键触发事件
话不多说上代码!!! 一开始以为很复杂,经过一番摸索和查找,发现也没有那么难,具体如下: 1.先在 created 里边开启键盘按键的监听事件,如下: created() {window.addEve ...
- MFC中如何让一个CStatic控件响应消息
在MFC中有时需要自己Create控件,如何写一个可以响应消息的控件呢,例如:CStatic 如下: CStatic test; test.Create("my static", ...
- MFC中动态创建控件以及添加事件响应
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- 解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题
解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题 参考文章: (1)解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题 (2)https://www.cnblogs.com/zlfP ...
- MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠
请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...
- 【MFC】MFC中调用系统软键盘的几种方法
1.直接运行微软系统自带的虚拟键盘程序"osk.exe" 在普通MFC项目中可以调用ShellExecute或者WinExec方法来直接运行微软系统自带的虚拟键盘程序"o ...
- android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决
Android应用中出现软键盘遮挡住按钮如何解决 发布时间:2020-11-20 16:25:47 来源:亿速云 阅读:110 作者:Leah Android应用中出现软键盘遮挡住按钮如何解决?相信很 ...
- MFC中改变按钮颜色的方法
本文参考学习 https://blog.csdn.net/zxccaoya/article/details/54142523 而来. 这里介绍mfc 中改变按钮颜色的最简单方法. 使用CMFCButt ...
最新文章
- ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结
- go语言中的多语言文本
- 李航统计学习方法视频教程
- 如何找到foreach索引
- 问题集锦(43-45)
- 派生类的赋值运算符重载【C++继承】
- Quartz框架中的JobStore
- 菜鸟学习笔记:Java提升篇1(容器1——List)
- SpringMVC大坑一枚:ContentNegotiatingViewResolver可能不利于SEO
- Linux操作系统使用基础03:Linux文件权限与目录配置
- IDEA 这样配置注释模板,让你高出一个逼格!
- paip.提升安全性--360,WI,AWVS三款WEB程序安全检测软件使用总结
- Linux 部分(tcp\ip)系统内核优化
- 【Android 】【Monkey Demons】 针对性的进行稳定性测试
- android 播放器 对比,播放器哪个最好用(五款最强播放器最全对比)
- 【Power BI ---M语言】M语言基础一
- matlab实现神经网络算法,matlab神经网络训练函数
- 微信公众号已认证怎么改名字,公众号昵称可以改吗?
- 查看UiPath许可证状态
- DIY空气检测仪:攀藤G5ST分析仪
热门文章
- Kotlin的魔能机甲——KtArmor(三)
- JavaScript 中检查数组是否包含值的 5 种方法
- springboot整合腾讯云cos对象储存
- xshell将项目部署到远程服务器上
- node.js宣言(这个名字好霸气)
- mysql5.7使用binlog 恢复数据的方法
- 演员用计算机的词谱是什么,你算啥曲谱_计算器歌曲谱薛之谦-绅士
- MySQL 创建数据库
- [Windows]_[初级]_[如何不编程判断进程是管理员模式启动(UAC)]
- 网络技术——网络运维工程师必会的网络知识(3)(详细讲解)