一、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消息的总结的更多相关文章

  1. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  2. 自制MFC消息响应定位器+原理分析

    mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...

  3. MFC编程入门之五(MFC消息映射机制概述)

    在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...

  4. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  5. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  6. MFC消息映射机制

    1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...

  7. MFC消息映射与命令传递

    题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...

  8. MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

    ////////////////////////////////////////////////////////////////////////////////////                 ...

  9. MFC消息响应机制分析

    ---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...

  10. 深入探讨MFC消息循环和消息泵

    首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...

随机推荐

  1. java代码实现目录结构

    今天用java代码来实现.像我们电脑盘符那样的目录结构.在代码开始之前首先.介绍一下.用.java代码实现目录的思想. 第一步:完成基础的.大家想.我们是如何获取文件的.是不是用File类,直接就获取 ...

  2. Solr In Action 中文版 第一章(四、五)

    1.1             功能概览1. 4 最后,让我们再依照以下的分类.高速的过一下Solr的主要功能: ·用户体验 ·数据建模 ·Solr 4的新功能 在本书中.为你的用户提供良好的搜索体验 ...

  3. 闪屏Flash动画

    这个也比较简单,之前也做过不少 今天这个就为了方便日后使用,希望大家都可以借鉴借鉴啊! @ViewInject(R.id.linMain) private LinearLayout linMain; ...

  4. [CMD]重启电脑

    https://zhidao.baidu.com/question/686086701903450132.html bat是批处理,可以调用关机命令关机. 制作方法如下: 打开记事本程序: 输入如下内 ...

  5. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

  6. 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治

    [BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...

  7. VC++MFC对话框程序中给对话添加背景图片

    VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^   工具/原料 Visual C++ 2010 方法一:用Pic ...

  8. json-lib-2.4-jdk15.jar 报错 net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案(Hibernate)

    使用hibernate容易出现该问题,主要是由于pojo类属性存在级联关系.比如说员工和部门,在员工表里面有部门属性,而在部门表里面有个员工集合,这样就存在了嵌套引用的问题了,就会抛出这个异常. 解决 ...

  9. 3.二级接口HierarchicalBeanFactory

    HierarchicalBeanFactory   字面意思是分层工厂, 那么这个工厂是怎么分层的呢? package org.springframework.beans.factory; //分层工 ...

  10. 【python】-- 函数非固定参数,返回值(return)

    函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...