关于MFC消息的总结
一、MFC的消息类型
MFC的消息类型大致可以分为三种:
1.命令消息。由菜单和工具栏或快捷键产生,以WM_COMMAND形式发出(以WM_COMMAND发出的还有很多控件,如Button等,但它们产生的不是命令消息,是通知消息)
命令消息的消息宏是:ON_COMMAND(id,memberFxn)。
2.窗口消息。由系统产生,典型特征是以WM_开头(WM_COMMAND除外)。此类消息映射宏前缀为“ON_WM_”,并且没有参数,因为不管是消息本身还是响应函数都与WM_XXX一一对应了。
3.通知消息。这类消息类型很多,也是最麻烦的。通常以WM_COMMAND或WM_NOTIFY形式发送。通知消息是由子控件发送给父窗口的。
WM_COMMAND形式是为了兼容以前的格式,因为MFC4.0之前都是以命令消息当作通知消息传递,后来子控件增多,不够用,所以增加了WM_NOTIFY,但为了向前兼容,仍然保留了WM_COMMAND消息,所以制造可麻烦。
父窗口处理通知消息的消息宏因此就分为两类:
WM_COMMAND形式的:ON_CONTROL(wNotifyCode,id,memberFxn)或ON_CONTROL_RANGE(wNotifyCode,id,idLast,memberFxn),该宏扩展后发现第一个参数就是WM_COMMAND。所以说ON_CONTROL宏是为了向前兼容的老用法了。
WM_NOTIFY形式的:ON_NOTIFY(wNotifyCode,id,memberFxn)或ON_NOTIFY_RANGE(wNotifyCode,id,idLast,memberFxn),该宏扩展后发现第一个参数就是WM_NOTIFY。
但是通常我们很少看到这两个宏,而是被类似ON_BN_CLICKED(id,memberFxn)这样的替换了。实际上这也是一种宏,这种宏展开后还是使用了ON_CONTROL或者ON_NOTIFY宏。只是把参数一wNotifyCode通知码改变成了更容易理解的BN_CLICKED罢了。
通知消息的一个很重要的特性是反射机制。只有继承CWnd的类有反射机制,通知消息有反射机制,占大多数,但其它有的消息也具有反射性,因为消息反射性的存在主要是为了方便改变子控件本身的某种特性,因此如WM_CTLCOLOR也具有反射性。查看某个消息是不是具有反射性,只需进入类向导中查看消息选项内部,该消息前有没有=号,有则代表有反射性。
反射机制的工作原理是:子控件产生通知消息后,首先发送给父窗口,让父窗口先处理。但是如果子窗口也具有处理该通知消息的能力,父窗口就将该消息返回给子窗口处理(即子窗口有优先处理自身消息的能力),如果子窗口处理后,消息结束,不再发给父窗口。否则,如果子窗口不具备处理该消息的能力,那么父窗口来处理,如果父窗口也无法处理,再往上抛,直到被处理或抛弃为止。
但是如果子窗口处理后,还想让父窗口处理,那么子窗口处理函数最后一定要reurn FALSE表示该消息没有被处理(实际上已经处理了),让父窗口接着处理。
那么子窗口处理这种反射回的信号的宏是什么呢?
就是ON_CONTROL_REFLECT_EX(wNotifyCode,memberFxn)和ON_NOTIFY_REFLECT_EX(wNotifyCode,memberFxn),memberFxn的返回值是BOOL,要改过来。
最后讲一讲通知码的问题:
参数wNotifyCode就是通知码,它标识着子控件发生了什么(比如按钮是被点击(BN_CLICKED)了,还是双击(BN_DOUBLECLICKED)了,还是失去焦点(BN_KILLFOCUS)),也可以看成消息,但是与WM_LBUTTONDBLCLK不是一回事,前者是通知消息的参数是告诉父窗口子窗口被双击了,后者是不需要告诉父窗口的,子窗口可以自己进行处理的消息)
还有一类宏是负责菜单项等是否可用的,下次再讲。
总之:
1.本文最主要的目的是让人看到消息映射宏后知道处理的是哪种类型的消息;
还有个问题就是为什么按钮的消息响应函数写在父窗口类中?
原因很简单,因为按钮是子控件,子窗口其实有处理通知消息的优先权,但是一般它不处理(除非你重载),所以就交给父类处理了。本来通知消息也是首先发送给父类的,只是父类又返回给了子控件,这样做是为了强调父窗口的控制权威。就跟很多事情基层做报告,报告拿到上级批准了,才允许执行一样,其实报告本身还是基层做的,只是显示了上级的权威性,控制性。
关于MFC消息的总结的更多相关文章
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
- 自制MFC消息响应定位器+原理分析
mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...
- MFC编程入门之五(MFC消息映射机制概述)
在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...
- VS2010/MFC编程入门之五(MFC消息映射机制概述)
VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...
- MFC消息响应机制 q
MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...
- MFC消息映射机制
1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...
- MFC消息映射与命令传递
题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
//////////////////////////////////////////////////////////////////////////////////// ...
- MFC消息响应机制分析
---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...
- 深入探讨MFC消息循环和消息泵
首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...
随机推荐
- json格式转数组注意事项
今天遇到一个特别奇葩的问题,json格式明明是正确的,转数组时却就是出不来,后来才发现是文件的编码问题,文件的编码一定要是utf-8无BOM格式,这点一定要切记!切记! 如果想确认json是否正确:h ...
- 算不算类似微信小程序
这几天微信发布的微信里生成小程序,刷爆了朋友圈. 微信生成的小程序不用下载安装就能在手机里出现,即用即删. 想到这里,我想到苹果手机本身再带类似于微信的小程序的呈现方式,也可以即用即删,那是我在去年久 ...
- ios 10 sticker pack application
看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强大的Siri主要感受到iMess ...
- windows安装apache
由于个人有强迫倾向,下载软件都喜欢从官网下载,摸索了好久终于摸清楚怎么从Apache官网下载windows安装版的Apache服务器了,现在分享给大家. 工具/原料 apache 方法/步骤 ...
- VC++MFC对话框程序中给对话添加背景图片
VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^ 工具/原料 Visual C++ 2010 方法一:用Pic ...
- intellij idea pycharm phpstorm webstorm 这些编辑器像 sublime text 一样使用 ctrl d 来操作光标多选。
在Windows 和 Linux 快捷键是 Alt+J,在 Mac OS X 系统下快捷键是 Ctrl+G . 参考 https://blog.jetbrains.com/phpstorm/2014/ ...
- EF之POCO应用系列3——延迟加载
EF之POCO应用系列4——延迟加载 当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下 ...
- Python菜鸟之路:Python基础(二)
一.温故而知新 1. 变量命名方式 旧的方式: username = 'xxxx' password = 'oooo' 新的方式: username, password = 'xxxx', 'oooo ...
- JavaScript点击事件-一个按钮触发另一个按钮
<input type="button" value="Click" id="C" onclick="Go();" ...
- Bootstrap学习-网格系统
1.实现原理 网格系统的实现原理非常简单,仅仅是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统.Boot ...