一、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. FreeSWITCH版本更新

    [1]FreeSWITCH版本更新 从2014年10月底开始,FreeSWITCH代码库改为由stash管理,该管理工具能更好地与jira集成. 如果你以前已经clone了代码,请做如下更新: git ...

  2. Java多线程编程总结一:多线程基本概念

    Java多线程编程总结一 – 初识多线程 进程.多进程.线程.多线程的概念 进程(process):CPU的执行路径.通俗的说就是系统中正在运行的程序.比如我们打开了浏览器.QQ等等,这些程序一旦被打 ...

  3. cg语言的一些术语

    在Cg中,用uniform修饰符声明一个参数表明它的值是由外部的数据源初始化的,而且在给定这批向量的处理中保持不变. Uniform inputs,表示一些与三维渲染有关的离散信息数据,这些数据通常由 ...

  4. Android中打包JAR时获取资源ID的方法

    前言:在打包android源码的时,有的时候源码中包含了资源文件,但是jar包中不包含,所以会异常,解决的方案就是不用系统的提供的id名,而是直接 获取id,如反射. 1.系统提供的方法: /** * ...

  5. 输入值/表单提交参数过滤有效防止sql注入的方法

    输入值/表单提交参数过滤,防止sql注入或非法攻击的方法:  代码如下: /** * 过滤sql与php文件操作的关键字 * @param string $string * @return strin ...

  6. Android异步处理四:AsyncTask的实现原理

    在<Android异步处理二:使用AsyncTask异步更新UI界面>一文中,我们介绍了如何使用AsyncTask实现异步下载图片,并且更新图片到UI界面的方法.本篇我们将学习Framew ...

  7. 将navigationbar的translucent属性设为No后,子控制器视图整体下移问题

    如果不将navigationbar.translucent = YES 会觉得颜色很浅,因为这是半透明状态 若navigationbar.translucent = NO,颜色问题解决,但是子控制器视 ...

  8. Watering Grass(贪心)

    Watering Grass n sprinklers are installed in a horizontal strip of grass l meters long and w meters ...

  9. elasticsearch从入门到出门-05-集群之踩坑

    自己搭的集群, 设备: win10 + ubuntu 16 的虚拟机一个: 下载的版本:elasticsearch-5.2.0 win10 解压下就好了,不说了. ubuntu 上,我想说多了都是泪! ...

  10. 6.1-AliasRegistry

    AliasRegistry //AliasRegistry package org.springframework.core; /** * Common interface for managing ...