初识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完成消息的处理

时间: 2024-08-07 16:46:51

初识MFC----消息映射机制的相关文章

c++对MFC消息映射机制和运行时类型识别的理解

对MFC消息映射机制和运行时类型识别的理解 对MFC消息映射机制的理解 MFC中派生于Cobject的每个类都有一个消息映射表,所有MFC窗口都有一个同样的窗口过程AfxWndProc(),AfxWndProc的参数列表中有一个是窗口句柄,在AfxWndProc函数中将句柄(HWND)转换成了窗口指针(CWnd*),通过这个窗口指针就可以获得该窗口的消息映射表.对于WM_COMMAND这类特殊消息,将依据C++的虚函数多态机制来决定调用哪个类的函数. 对MFC运行时类型识别的理解 定义一个CRu

MFC消息映射机制详解

 MFC消息映射机制: 在每个能接收和处理消息的类中,定义一个消息与消息处理函数的映射表,即消息映射表.MFC有一个窗口句柄与C++对象指针的映射表,当窗口收到消息时,消息的第一个参数指明了该消息与哪个窗口句柄相关,通过映射表找到C++对象指针,然后将这个指针传递给应用程序框架窗口类的基类,基类调用WindowProc函数(在wincore.cpp文件中),这是一个虚函数,函数内部调用OnWndMsg函数,消息处理就是在这个函数内完成的,该函数也在wincore.cpp中.OnWndMsg函

MFC编程入门之五(MFC消息映射机制概述)

在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什么是消息?  窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:2.消息附带的WPARAM类型的参数:3.消息附带的LPARAM类型的参数.其实,我们一般所说的消息是侠义上的消息值,也就是一个无符号整数,经常被定义为宏. 二.什么是消息映射机制?  MFC使用一种消息映射机制来处理消息,在应

VS2010/MFC编程入门之五(MFC消息映射机制概述)

VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html     上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容.        前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的

MFC消息映射机制

1 消息循环所在的函数 CWinApp::Run 2  消息类别 <1>Windows Messages WM_XX前缀开头,但是除了WM_COMMAND消息外. <2>Control Notifications 包含来自控件或者子窗口发给父窗口的 WM_COMMAND的通知消息. <3>Command Messages 菜单,工具栏按钮,快捷键 3 消息的发送和接受 CWinApp::Run函数接受消息并且将他们分派到合适的窗口,大多数命令消息时被发送到主框架窗口.接

C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用

机制3:MFC消息映射机制: 类内声明,类外定义宏,绑定消息处理函数 派生自CCmdTarget 类内声明宏:DECLARE_MESSAGE_MAP() 类外添加实现宏: BEGIN_MESSAGE_MAP(类名,父类名) END_MESSAGE_MAP() //数据结构 struct AFX_MSGMAP_ENTRY { UINT nMessage;   // 消息ID UINT nCode;      // 通知码 UINT nID;        // 控件ID或消息 UINT nLast

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

mfc消息映射

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