zoukankan      html  css  js  c++  java
  • MFC 三种消息

    在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”的概念,进行消息反射,可以使得控制子窗口能够自行处理与自身相关的一些消息,增强了封装性,从而提高了控制子窗口的可重用性。
  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/5098880.html
Copyright © 2011-2022 走看看