关于对话框不能响应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++看,对话框完全收不到键盘消息 ...
随机推荐
- CyclicBarrier簡介
package CyclicBarrier; import java.util.concurrent.CyclicBarrier;import java.util.concurrent.atomic. ...
- 细说SVN集中式版本控制器
svn全称Subversion,实现多人开发同一个项目时,对源代码进行管理的工具.在公司里边,一个项目是由多人同时在开发,大家在本地自己电脑开发php代码,完毕后就commit上传给服务器运行. 如 ...
- shell中颜色的设置
linux启动后环境变量加载的顺序为:etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc → [/etc/bashrc] 想 ...
- migrantion
Enable-Migrations - ConfigurationTypeName namespace.DbContext Enable-Migrations命令创建了一个新的Migrations文件 ...
- webpack搭建自己的项目
使用代理的方式参考地址:http://www.cnblogs.com/wangyongcun/p/7665687.html npm 常用模块 npm init 创建package.json文件 一值回 ...
- java 知识汇总
一.springboot cloud 1.maven 配置 parent:org.springframework.boot:sping-boot-starter-parent dependencies ...
- js sort
排序算法 比较的过程必须通过函数抽象出来.通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关 ...
- "cni0" already has an IP address different from 10.244.2.1/24。 Error while adding to cni network: failed to allocate for range 0: no IP addresses available in range set: 10.244.2.1-10.244.2.254
"cni0" already has an IP address different from 10.244.2.1/24. Error while adding to cni n ...
- yum 安装 php7 ,lamp ,以及安装swoole
1 更新yum yum update 2 安装依赖 yum -y install pcre* openssl* yum -y install gcc make gd-devel libjpeg-dev ...
- Java中方法的重写
★★前提:方法的重写建立在继承关系上★★ 在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量. 所谓方法的重写是指子类中的方法与父类中继承 ...