消息映射机制的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息映射机制的介绍相关的知识,希望对你有一定的参考价值。

参考技术A

消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,它唯一地定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子, 当用户敲键, 移动鼠标或者单击控件。系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体改变窗体大小。应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。

初识MFC----消息映射机制

一、MFC的消息映射机制

  1、消息映射机制的使用

    1.1类必须派生自CCmdTarget

    1.2类内必须添加声明宏 DECLARE_MESSAGE_MAP

    1.3类外必须添加实现宏 BEGIN_MESSAGE_MAP     END_MESSAGE_MAP

  2、数据结构

    struct AFX_MSGMAP_ENTRY  (宏展开的静态数组每个元素的类型)

    {

      UINT nMessage;   // 消息ID

      UINT nCode;      // 通知码

      UINT nID;        // 命令ID/控件ID

      UINT nLastID;    // 最后一个控件ID

      UINT nSig;       // 消息处理函数的类型

      AFX_PMSG pfn;    // 消息处理函数的地址(指针)

    };

 

    struct AFX_MSGMAP  (宏展开的静态变量的类型)

    {

      const AFX_MSGMAP* pBaseMap;  //保存父类静态变量地址(负责连接链表)

      const AFX_MSGMAP_ENTRY* lpEntries;       //指向相应类的静态数组首地址

    };

3、宏展开的代码

4、宏展开各部分的作用

  _messageEntries[] -静态数组,数组中每一个元素保存了消息ID和对应的处理函数

  messageMap -静态变量,保存父类静态变量地址(负责连接链表),指向相应类的静态数组首地址

  GetMessageMap() -虚函数,获取本类静态变量地址(获取链表头节点)

5、消息映射机制的执行过程

  5.1获取和窗口句柄绑定在一起的框架类对象地址(pFrame)

  5.2利用pFrame调用GetMessageMap虚函数获取本类静态变量地址(链表头节点)pMessageMap

  5.3利用pMessageMap获取相应类的静态数组,并到数组中匹配每个元素,如果找到了执行5.5,如果没找到执行5.4

  5.4利用pMessageMap获取父类静态变量地址,如果为NULL遍历结束,如果不为NULL执行5.3

  5.5利用找到的数组元素的最后一个成员,并调用之,完成消息的处理

二、MFC消息的分类

  1、Windows标准消息(例如:键盘、鼠标、定时器......)

    ON_WM_CREATE

    ON_WM_PAINT

    ON_WM_MOUSEMOVE

    ...

    ON_WM_xxxx

    除了WM_COMMAND之外,所有以WM_开头的消息都是标准消息;从CWnd派生的类都可以接收这类消息;

  2、命令消息(WM_COMMAND)

    ON_COMMAND(命令ID,处理函数)

    来自菜单、加速键、工具栏按钮的消息;这类消息都以WM_COMMAND形式呈现;通过菜单项的ID标识来区分不同的命令消息;从CCmdTarget派生的类都可以接收到这类消息;

  3、通知消息(WM_COMMAND)

    ON_EN_CHANGE

    ON_通知码

    由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知事件的发生;这类消息也是以WM_COMMAND形式呈现的;从CCmdTarget派生的类都可以接收到这类消息;

  4、自定义消息

    #define WM_MYMESSAGE WM_USER+n

    ON_MESSAGE

   注:视图类和框架类既可以接收标准消息也可以接收命令消息和通知消息;文档类和应用程序类只能接收命令消息和通知消息

三、消息的处理

  1、当消息产生进入窗口处理函数AfxWndProc

  2、利用CWnd::FromHandlePermanent函数获取和窗口句柄绑定在一起的框架类对象地址(pFrame)

  3、利用pFrame调用框架类成员虚函数WindowProc完成消息的处理

 

以上是关于消息映射机制的介绍的主要内容,如果未能解决你的问题,请参考以下文章

windows下的MFC消息映射机制

windows下的MFC消息映射机制

初识MFC----消息映射机制

afx_msg与消息映射机制

消息映射机制

RocketMQ的底层消息存储架构以及优化措施