关于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 ...
随机推荐
- java面试的那些事
跳槽面临的第一个难关那就是面试吧.面试的好坏直接关乎着你年薪的多少.如何顺利完成面试的那些难题,今天我们就从java中复习一下.看看经常面试的知识点,为什么面试这些知识点, 如果你是初级的或刚毕业的j ...
- 文本信息检索——布尔模型和TF-IDF模型
文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
- 什么是scale up和scale out
Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...
- 表转List泛型数组
转换那块怕忘记,留存一下 using System; using System.Collections.Generic; using System.Data; using System.Linq; u ...
- Python 推导式、迭代器、生成器、模块和包
一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...
- maven-tomcat7;IOC;AOP;数据库远程连接
[说明]真的是好烦下载插件啊,maven-tomcat7 插件试了好多次都不行,下载不成:部署不成:好不容易从github中得到的springmvc项目也是运行不起来,中间又是查了许多东西,绕着绕着都 ...
- Java中List.remove报UnsupportedOperationException异常
今天项目中有个需求场景: A和B都是List,而B是A的子集,现在想求A和B的差集. 想到了List中提供的removeAll()方法可以求得差集,但是结果确报了UnsupportedOperatio ...
- ubuntu 安装wine
笔记 1.安装源 sudo add-apt-repository ppa:wine/wine-builds sudo apt-get update 2.安装wine sudo apt-get inst ...
- Nginx教程
Nginx教程 1.背景 介绍 Nginx是一个高性能的HTTP服务器,以及反向代理服务器 组成 Ngnix有内核和模块组成.微结构的内核根据配置文件将一个请求映射到一个location块中,该loc ...
- api 爬虫 避免相同 input 在信息未更新 情况下 重复请求重复
限