在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。

(1)窗口消息:WM_XXX

窗口消息(Window Message)一般与窗口的内部运作有关,如:创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。

(2)命令消息:WM_COMMAND

命令消息一般与处理用户请求相关,当用户单击一个菜单项或工具栏时,命令消息产生,并被发送到能处理该请求的类对象(如:装载文件、编辑文本和保存选项等)。

(3)控件通知:有多种格式       通常,控件通知在某些重要事件发生时,由控件窗口发送到父窗口,如打开一个组合框。控件通知为父窗口进一步控制子窗口提供了机会。例如,打开一个组合框时,父窗口可以用组合框初建时得不到的消息填充它。

BN_XXXX是CButton产生的消息,EN_XXXX是CEdit产生的消息,等等。

这个博客写的比较详细http://blog.csdn.net/zhanglidn013/article/details/6958257

下面这个通知消息我比较模糊:

Windows自定义的子窗口控件(Predefined Chilld Window Controls)包括BUTTON、COMBOBOX、EDIT、LISTBOX、RichEdit、SCROLLBAR、STATIC。

以上Windows预定义的子窗口控件的窗口过程中做了反射处理,即在某一事件(点击菜单,点击加速键,点击子窗口按钮,点击工具栏按钮)处理后发送一个WM_COMMAND通知消息给父窗口。这样某个事件发生了,子窗口做默认处理后,父窗口可以做后续处理使父子窗口工作协调。例如按下按钮,按钮呈凹陷状,这是由BtnProc对WM_LBUTTONDOWN(WM_PAINT)的重绘处理;松开按钮,按钮恢复原态,这是由BtnProc对WM_LBUTTONUP(WM_PAINT)的重绘处理。往往在松开按钮的时候,发送WM_COMMAND消息(消息码为BN_CLICKED)给父窗口,由父窗口做点击事件响应,这样便于状态和逻辑的分离。

还有消息映射 消息反射之分。

 

①、映射机制的原理 Windows 下的程序包括 Windows 系统都是基于消息机制的。 MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息响应函数的静态对照表,即消息映射表; 在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中; 当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可以知道该类能否处理此消息; 如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数!

②、一般情况下,一个MFC的消息映射在程序中有三处相关信息:1》消息响应函数的声明 2》消息响应函数实现 3》用来关联消息和消息响应函数的宏 具体见示例代码……更为详细的讲解参见《深入浅出MFC 第二版 简体中文版》 - 侯杰:http://www.cctry.com/thread-192-1-1.html
③、针对不同的 Windows 消息,MFC提供了不同的消息映

射宏,主要分为如下六类:

1、Windows 消息映射宏 Windows 消息映射宏用于处理普通的窗口消息。此类消息映射宏前缀为“ON_WM_”,并且没有参数;

2、命令消息映射宏 命令消息 WM_COMMAND 是一种特殊的窗口消息,它从一个窗口发送到另一个窗口,以处理来自用户的请求,是 ON_COMMAND 宏和 ON_COMMAND_RANGE 宏;

3、控件通知消息映射宏 控件通知消息是指控件窗口发送到其父窗口的消息,其消息映射宏为 ON_CONTROL 和 ON_CONTROL_RANGE,有时在程序中并不见 ON_CONTROL 宏,而见 ON_BN_CLICKED 宏, 其实 ON_CONTROL 宏派生出许多的映射宏,包括 ON_BN_CLICKED 宏等;

4、控件通知消息映射宏 控件通知消息映射宏处理的窗口消息有 WM_COMMAND,WM_NOTIFY,其消息映射宏有 ON_NOTIFY 和 ON_NOTIFY_RANGE;

5、反射消息映射宏 反射消息是指子窗口向父窗口发送的通知消息或控件通知消息,父窗口将该消息转化为相应的反射消息发送给子窗口优先处理。 处理窗口消息 WM_NOTIFY+WM_REFLECT_BASE 的宏是 ON_NOTIFY_REFLECT,处理窗口消息 WM_COMMAND+WM_REFLECT_BASE 的宏是 ON_CONTROL_REFLECT, 还有其他的反射消息宏,具体请参考MDSN。

6、扩展消息映射宏 有 ON_COMMAND | ON_COMMAND_RANGE | ON_NOTIFY | ON_NOTIFY_RANGE ……

④、自定义消息的发送与响应:

1、自定义消息号:#define WM_CCTRY_MSG (WM_USER+100)

2、在头文件中添加消息响应函数的声明:afx_msg LRESULT OnCcTryMsg(WPARAM wParam, LPARAM lParam);

3、在CPP文件中添加消息响应函数的实现: LRESULT CXXXDlg::OnCcTryMsg(WPARAM wParam, LPARAM lParam) { //相关代码; }

4、在 BEGIN_MESSAGE_MAP 与 END_MESSAGE_MAP 之间加入消息的映射代码:ON_MESSAGE(WM_CCTRY_MSG, &CDlgTestDlg::OnCcTryMsg)

5、消息的发送:

消息反射解释

父窗口将控制子窗口发给它的通知消息,首先反射回子窗口进行处理(即给控制子窗口一个机会,让控制子窗口处理此消息),这样通知消息就有机会能被子窗口自身进行处理。

MFC中引入消息反射的原因

在Windows的消息处理中,控制子窗口的发给其父窗口的通知消息只能由其父窗口进行处理,这使得控制子窗口的自身能动性大大降低(你想,它连改变自己的背景色,处理一个自身滚动问题都要其父窗口来完成),为了解决这个问题,在MFC中引入了反射消息“Reflect Message”的概念,进行消息反射,可以使得控制子窗口能够自行处理与自身相关的一些消息,增强了封装性,从而提高了控制子窗口的可重用性。

MFC 三种消息的更多相关文章

  1. SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)

    目录 说明 生产端 消费端 说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同 ...

  2. Spring整合JMS(二)——三种消息监听器

    原文地址:http://haohaoxuexi.iteye.com/blog/1893676 1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监 ...

  3. spring与activemq(三种消息监听方式)

    1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...

  4. Spring整合JMS(二)——三种消息监听器(转)

    *注:别人那复制来的 1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageList ...

  5. JS三种消息框的使用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

    1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...

  7. Android三种消息提示

    Android消息提示有三种方式: 1  使用Toast显示消息提示框 Toast类用于在屏幕中显示一个提示信息框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失.通常用于显示 ...

  8. js三种消息框总结-警告框、确认框、提示框

    js消息框类别:警告框.确认框.提示框 警告框:alert("文本"); 确认框:confirm("文本"); 提示框:prompt("文本" ...

  9. Python selenium 三种消息框处理和浏览器(页面跳转)句柄处理

    1. alert: 警告框,只是一个提示信息,只有一个确定按钮,起提示用户的作用: 2.confirm: 确认框,确定和取消按钮会带来不同的结果.点击确定会执行操作,点击取消按钮会取消操作: 3.pr ...

随机推荐

  1. ZooKeeper在分布式应用中的作用

    作者:陈叶皓(携程邮轮研发部软件架构师) 是不是要在标题的“作用”之前加上“重要”两个字,我犹豫了一下,zookeeper提供的功能是如此的重要,以至于如果你在应用中不使用它,早晚也会在你的应用中去实 ...

  2. Linux——curl(转)

    先介绍curl工具的使用,在其他文章中介绍如何使用curl发送Identity API linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具 ...

  3. Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  4. pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题

    只要将pycharm下打开项目后: 将你运行文件(.py)的项目设置为根目录,就不会出现红色线:

  5. usermod命令/用户密码管理/mkpasswd命令

    3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令 usermod命令 设置用户uid: usermod  -u  111 username 设置用户gid usermod ...

  6. kuser_cmpxchg_check 原子操作

    对于ARM体系结构,每一个由用户态到内核态的中断或异常处理路径都经过kuser_cmpxchg_check,kuser_cmpxchg_check中检查被中断的地址是否大于TASK_SIZE:TASK ...

  7. 使用php用IE打开指定网页

    $cmd = '"C:\Program Files\Internet Explorer\iexplore.exe" http://www.baidu.com'; exec($cmd ...

  8. 代码记录——phase16,block36(修正后)

    加入边缘判定,<2则加2. if (x_upleft<2) x_upleft=x_upleft+2; if (y_upleft<2) y_upleft=y_upleft+2; HRE ...

  9. ITIL也玩“太极拳”

    近期看到一篇老外写的发布管理的培训材料,其中把发布管理比喻成中国太极图中的“阴”,把变 更管理比喻成“阳”,觉得还挺有意思.之所以这么比喻是因为,他认为“发布”是被动的,接受的,有女性阴柔的一面:而“ ...

  10. 防止dedecms注入文件挂马的解决方法

    1.目录权限我们不建议用户把栏目目录设置在根目录,原因是这样进行安全设置会十分的麻烦,在默认的情况下,安装完成后,目录设置如下:(1) data.templets.uploads.a或5.3的html ...