关于对话框不能响应OnKeyDown和OnChar函数的一些说明
(1)现象
在MFC的对话框中,映射了WM_CHAR和WM_KEYDOWN消息响应函数后,还是不能响应OnKeyDown和OnChar。
(2)原因
因为MFC在进行设计的时候,这两个消息被对话框上的控件截获了,不能到达这两个消息响应函数,对于OnKeyDown来说,只要把对话框
上的控件都删除了,就可以接收到WM_KEYDOWN消息,但是还是接收不到WM_CHAR消息。
(3)解决
方法1:重载PreTranslateMessage这个虚函数;在里面加上SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);这一句后,对话
框的OnKeyDown和OnChar函数就生效了。
方法2:在PreTranslateMessage虚函数里直接处理WM_KEYDOWN或WM_CHAR。
eg:对话框屏蔽esc键
BOOL Cmfc_testDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_ESCAPE)
return TRUE;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
(4)执行顺序
三个消息的执行顺序为WM_KEYDOWN、WM_CHAR、WM_KEYUP
(5)关于PreTranslateMessage()函数
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数窗口的消息都要通过这里,比较常用,当你需要在
MFC之前处理某些消息时,常常要在这里添加代码。通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流
出来。
前面说了绝大多数窗口的消息都可以通过这个虚函数进行控制,这个绝大数其实是只有穿过消息队列的消息才受PreTranslateMessage
()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在,
故切记SendMessage 发送的消息是不能用PreTranslate来截取的,应该重写WindowProc窗口过程来响应消息!
(6)SendMessage()和PostMessage()
SendMessage函数发送的消息会直接发送到窗口过程而不经过消息队列,且直到消息处理完成后,SendMessage才返回。函数返回值指定
消息处理的结果,依赖于所发送的消息。
PostMessage函数将一个消息寄送到指定窗口的消息队列里,不等待线程处理消息就立刻返回。函数执行成功返回TRUE,否则返回
FALSE。
LRESULT WINAPI SendMessage(
HWND hWnd, //窗口句柄
UINT Msg, //消息值
WPARAM wParam,//消息附加信息
LPARAM lParam //消息附加信息
);
BOOL WINAPI PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
(6)对话框特殊按键消息的处理
默认情况下对话框响应Enter键的处理是调用基类的OnOK()函数,Esc键会调用基类的OnCancel()函数,这两个函数都是虚函数,故要
对Enter或Esc键做相应处理的话可以重写这两个函数。
单击对话框标题栏上的关闭按钮时会先后产生WM_CLOSE消息,故需要对标题栏关闭按钮按下做处理的时候可以在WM_CLOSE消息的消息
响应函数中进行。
原文:http://blog.csdn.net/wang_cong0214/article/details/8280324
关于对话框不能响应OnKeyDown和OnChar函数的一些说明的更多相关文章
- 对话框的按键处理 PreTranslateMessage、OnKeyDown和OnChar
对话框的按键处理 PreTranslateMessage.OnKeyDown和OnChar 1.MFC对话框不能响应OnKeyDown和OnChar函数(1)现象 在MFC的对话框中,映射了WM_C ...
- [原]MFC中DIALOG(对话框)程序响应加速键(快捷键)
[原]MFC中DIALOG(对话框)程序响应加速键(快捷键) 2014-8-6阅读266 评论0 新建一个对话框程序,项目名为Test,删除默认确定,取消和静态文本框控件.添加一个按钮,Caption ...
- VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...
- 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)
[Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809
- MFC编程入门之九(对话框:为控件添加消息处理函数)
这一节讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件定义了诸多消息,我们对他们操作时会触发消息,这些消息最终由消息处理函数处理,比如我们点击按钮时就会产生BN_CLICKED消息,修 ...
- 关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI. void CX ...
- JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域
JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行) JS的作用:表单验证,减轻服务端的压力 添加页面动画效果 动态更改页面内容 Ajax网络请求 (一)常见的对 ...
- Modeless对话框如何响应快捷键
MFC,Modeless对话框不会响应快捷键.解决的方案很多,其中之一是在PreTranslateMessage中地键盘消息进行拦截处理.
- mfc对话框不能响应键盘消息
这东西真是奇怪,找了半天原因,最终的发现却是让人抓狂,呵呵 现象:对话框按ESC或回车都不能关闭窗口(我没有处理PreTransplanteMessage),用spy++看,对话框完全收不到键盘消息 ...
随机推荐
- 微信小程序快速移植支付宝小程序
移植背景: 1. 支付宝小程序开发文档只了解了大致框架,跑了demo,具体Api.组件没太多了解: 2. 已有微信小程序,移植支付宝小程序做预研(主要针对授权登录.支付等功能). 3. 移植的微信小程 ...
- windows phpstudy如何扩展MongoDB
phpstudy如何扩展MongoDB 作者: default|标签:phpstudy MongoDB PHP|2017-9-9 10:17 phpstudy扩展MongoDB 前置工作安装PHPst ...
- java 线程Thread 技术--线程状态与同步问题
线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...
- istio-jaeger-python调用链配置
虽然,istio ingress controller已经生成了jaeger 记录所需要的信息,但是多个分布式之间没法清晰记录相互之间的依赖关系.所以相关的项目还需要加入特殊配置. 如:python- ...
- 富文本编辑器--FCKEditor 上传图片
FCKEditor的最新版本已经更改名称为CKEditor: 1.在页面引入fckeditor目录下的fckeditor.js <script type="text/javascrip ...
- Hyperscan与Snort的集成方案
概况 Hyperscan作为一款高性能的正则表达式匹配库,非常适用于部署在诸如DPI/IPS/IDS/NGFW等网络解决方案中.Snort (https://www.snort.org) 是目前应用最 ...
- iOS.Library.Architecture
在用file查看library的architechture时有以下输出: $ file WebPWebP: Mach-O universal binary with 3 architecturesWe ...
- java读取properties文件时候要注意的地方
java读取properties文件时,一定要注意properties里面后面出现的空格! 比如:filepath = /home/cps/ 我找了半天,系统一直提示,没有这个路径,可是确实是存在的, ...
- P<0.05就够了?还要校正!校正!3个方法献上
P<0.05就够了?还要校正!校正!3个方法献上 (2017-01-03 17:55:12) 转载▼ 分类: 数理统计 (转 医生科研助手 解螺旋 微信公众号) 当有多组数据要比较时, ...
- PHP编程时的规范化命名
要想成为一名“合格”的程序员,就必须要有良好的编程习惯和规范,这样做的好处有很多,诸如:可以提高代码质量,提高程序的可维护性,提高开发速度和效率等.以下就简要的列出几条日常编写程序时大概要注意的一些“ ...