MFC 三种消息

摘要:
MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控制通知。上述Windows预定义的子窗口控件反映在窗口进程中,也就是说,在处理事件后发送WM_命令通知消息到父窗口。② 通常,MFC的消息映射在程序中有三个相关信息:1)消息响应函数的声明2)消息响应功能的实现3)用于将消息和消息响应函数关联的宏如示例代码所示……处理窗口消息WM_NOTIFY+WM_REFLECT_BASE的宏为ON_NOTIFY _REFLECT,BASE的处理窗口消息WM_ COMMAND+WM_ REFLECT_宏为ON_ CONTROL_。有关详细信息,请参阅MDSN。

在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 三种消息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windbg学习18(sx和ld)微信小程序-返回并更新上一页面的数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

详解linux进程间通信-消息队列

前言:前面讨论了信号、管道的进程间通信方式,接下来将讨论消息队列。   一、系统V IPC 三种系统V IPC:消息队列、信号量以及共享内存(共享存储器)之间有很多相似之处。 每个内核中的 I P C结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符( i d e n t i f i e r )加以引用。 无论何时创建I P C结构(调用m s...

RocketMQ 入门

一、rocketMQ是什么 rocketmq是一款低延迟、高可靠、可伸缩、已使用的消息中间件。具有以下特性: 1、支持发布/订阅、点对点(p2p)消息模型 2、同一个队列中支持先进先出(FIFO)和严格的顺序传递 3、支持拉(pull)和推(push)两种消息模式 4、单一队列百万消息的堆积能力 5、支持多种消息协议,比如: JMS 、MQTT 6、分布式...

【--RocketMQ--】RocketMQ实现事务消息

在RocketMQ4.3.0版本后,开放了事务消息这一特性,对于分布式事务而言,最常说的还是二阶段提交协议,那么RocketMQ的事务消息又是怎么一回事呢,这里主要带着以下几个问题来探究一下RocketMQ的事务消息:   事务消息是如何实现的  我们有哪些手段来监控事务消息的状态  事务消息的异常恢复机制  RocketMQ的事务消息是如何实现的 Roc...

1、springcloud简介

摘要: springcloud是一系列框架的有序集合。它利用springboot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用springboot的开发风格做到一键启动和部署。 springcloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架...

Unity调用安卓Android的Toast

需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试。 方法一:Unity中,C#主导 //Unity调用安卓的土司 public static void MakeToast(stringinfo) { AndroidJavaClass unityPla...

小程序:前端防止用户重复提交&即时消息(IM)重复发送问题解决

背景: 最近参与开发的小程序,涉及到即时消息(IM)发送的功能; 聊天界面如下,通过键盘上的【发送】按钮,触发消息发送功能 问题发现: 功能开发完毕,进入测试流程;测试工程师反馈说: 在Android手机上,在极短的时间内频繁点击键盘上的【发送】按钮,消息会重复发送;IOS上该问题不太明显 本以为是普通的防重复提交问题,于是自然想到通过设定flag/js...