在调试写的代码的时候,碰到一个“很奇怪的"现象。因为进度的原因,当时就是当成一个异常输入进行了处理。现在空闲下来,重现了问题现象。现象是:在一个弹出窗口中,按键”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中按钮对于键盘回车和空格响应,引发的问题相关推荐

  1. MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  2. vue 项目中使用键盘回车或空格按键触发事件

    话不多说上代码!!! 一开始以为很复杂,经过一番摸索和查找,发现也没有那么难,具体如下: 1.先在 created 里边开启键盘按键的监听事件,如下: created() {window.addEve ...

  3. MFC中如何让一个CStatic控件响应消息

    在MFC中有时需要自己Create控件,如何写一个可以响应消息的控件呢,例如:CStatic 如下: CStatic test; test.Create("my static",  ...

  4. MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  5. 解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题

    解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题 参考文章: (1)解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题 (2)https://www.cnblogs.com/zlfP ...

  6. MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠

    请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...

  7. 【MFC】MFC中调用系统软键盘的几种方法

    1.直接运行微软系统自带的虚拟键盘程序"osk.exe" 在普通MFC项目中可以调用ShellExecute或者WinExec方法来直接运行微软系统自带的虚拟键盘程序"o ...

  8. android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决

    Android应用中出现软键盘遮挡住按钮如何解决 发布时间:2020-11-20 16:25:47 来源:亿速云 阅读:110 作者:Leah Android应用中出现软键盘遮挡住按钮如何解决?相信很 ...

  9. MFC中改变按钮颜色的方法

    本文参考学习 https://blog.csdn.net/zxccaoya/article/details/54142523 而来. 这里介绍mfc 中改变按钮颜色的最简单方法. 使用CMFCButt ...

最新文章

  1. ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结
  2. go语言中的多语言文本
  3. 李航统计学习方法视频教程
  4. 如何找到foreach索引
  5. 问题集锦(43-45)
  6. 派生类的赋值运算符重载【C++继承】
  7. Quartz框架中的JobStore
  8. 菜鸟学习笔记:Java提升篇1(容器1——List)
  9. SpringMVC大坑一枚:ContentNegotiatingViewResolver可能不利于SEO
  10. Linux操作系统使用基础03:Linux文件权限与目录配置
  11. IDEA 这样配置注释模板,让你高出一个逼格!
  12. paip.提升安全性--360,WI,AWVS三款WEB程序安全检测软件使用总结
  13. Linux 部分(tcp\ip)系统内核优化
  14. 【Android 】【Monkey Demons】 针对性的进行稳定性测试
  15. android 播放器 对比,播放器哪个最好用(五款最强播放器最全对比)
  16. 【Power BI ---M语言】M语言基础一
  17. matlab实现神经网络算法,matlab神经网络训练函数
  18. 微信公众号已认证怎么改名字,公众号昵称可以改吗?
  19. 查看UiPath许可证状态
  20. DIY空气检测仪:攀藤G5ST分析仪

热门文章

  1. Kotlin的魔能机甲——KtArmor(三)
  2. JavaScript 中检查数组是否包含值的 5 种方法
  3. springboot整合腾讯云cos对象储存
  4. xshell将项目部署到远程服务器上
  5. node.js宣言(这个名字好霸气)
  6. mysql5.7使用binlog 恢复数据的方法
  7. 演员用计算机的词谱是什么,你算啥曲谱_计算器歌曲谱薛之谦-绅士
  8. MySQL 创建数据库
  9. [Windows]_[初级]_[如何不编程判断进程是管理员模式启动(UAC)]
  10. 网络技术——网络运维工程师必会的网络知识(3)(详细讲解)