`
javababy1
  • 浏览: 1161757 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MFC消息映射宏

 
阅读更多

MFC消息映射宏

    消息的传递与发送是Windows应用程序的核心所在,任何事件的触发与响应均要通过消息的作用才能得以完成。在SDK编程中,对消息的获取与分发主要是 通过消息循环来完成的,而在MFC编程中则是通过采取消息映射的方式对其进行处理的。相比而言,这样的处理方式要简单许多,这也是符合面向对象编程中尽可 能隐含实现细节的原则。一个完整的MFC消息映射包括对消息处理函数的原型声明、实现以及存在于消息映射中的消息入口。这几部分分别存在与类的头文件和实现文件中。一般情况下除了对自定义消息的响应外,对于标准Windows 消息的映射处理可以借助ClassWizard向导来完成。   在选定了待处理的Windows 消息后,向导将会根据消息的不同而生成具有相应函数参数和返回值的消息处理代码框架。下面这段代码给出了一个完成的MFC消息映射过程:

    // 在.h文件中的声明 //{{AFX_MSG(CMessageMapView) afx_msg void OnMove(int x, int y); //}}AFX_MSG DECLARE_MESSAGE_MAP() …… // 在.cpp文件中的实现 BEGIN_MESSAGE_MAP(CMessageMapView, CView) //{{AFX_MSG_MAP(CMessageMapView) ON_WM_MOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP() …… void CMessageMapView::OnMove(int x, int y) { CView::OnMove(x, y); // TODO: Add your message handler code here }

    这里对Windows标准消息WM_MOVE做了消息映射,其中用到的BEGIN_MESSAGE_MAP、END_MESSAGE_MAP 和头文件中的DECLARE_MESSAGE_MAP等均是用于消息映射的宏。这些宏声明了在应用程序框架中可用于在系统中浏览所有对象映射的成员变量和 函数。除了以上三个比较常见的宏之外,MFC还提供了其他一些用于消息映射的宏,详情可参见下表:

    宏名

    说明

    DECLARE_MESSAGE_MAP

    在头文件声明源文件中所含有的消息映射

    BEGIN_MESSAGE_MAP

    标记源文件消息映射的开始

    END_MESSAGE_MAP

    标记源文件消息映射的结束

    ON_COMMAND

    将特定命令的处理委派给类的一个成员函数

    ON_COMMAND_RANGE

    把一定范围内的command IDs 映射到相应的函数上

    ON_CONTROL

    映射一个函数到一个定制控制通知消息。其中,定制控制通知消息是从一个控制发送到其父窗口的消息。

    ON_CONTROL_RANGE

    将一个控制ID的范围映射到一个消息处理函数

    ON_CONTROL_REFLECT

    映射一个由父窗口反射回控制的通知消息

    ON_MESSAGE

    将一个用户自定义消息映射到一消息处理函数

    ON_NOTIFY

    映射一个控制消息到一个函数

    ON_NOTIFY_RANGE

    映射一个控制ID范围内的控制消息到一个函数

    ON_NOTIFY_EX

    映射一个控制消息到一个函数,该成员函数返回FALSE或TRUE来表明通知是否应被传送到下一个对象以进行其他反应。

    ON_NOTIFY_EX_RANGE

    映射一个控制ID范围内的控制消息到一个函数,该成员函数返回FALSE或TRUE来表明通知是否应被传送到下一个对象以进行其他反应

    ON_NOTIFY_REFLECT

    映射一个控制消息到一个函数。该消息将会被控制的父窗口反射回来。

    ON_REGISTERED_MESSAGE

    映射一个唯一的消息到一个将要处理该注册消息的函数上。该消息是由RegisterWindowMessage()函数注册的。

    ON_UPDATE_COMMAND_UI

    映射一个函数来处理一个用户接口更新命令消息

    ON_UPDATE_COMMAND_UI_RANGE

    映射一个命令ID的范围到一个更新消息处理函数

    一般作为基类使用的CWnd类为Windows消息定义了大量窗口消息的缺省处理函数,这些函数大部分只是简单地调用了Windows的缺省 过程,可以在派生类中对其进行重载。但是MFC应用程序框架却并没有象使用普通虚函数那样使用Windows消息处理函数,而是通过宏将指定的消息映射到 派生类的成员函数。如果MFC仍象普通虚函数一样对消息响应函数进行处理,那么CWnd类就要为这上百个消息声明虚函数。而C++将为在程序中使用的每一 个派生类都提供一个被称作vtable的虚拟函数分配表,这个分配表需要为每一个虚函数提供一个4字节的入口,而不管这些函数在派生类中是否真正被重载, 这将不能有效利用存储空间。而且对于每一个不同类型的窗口或控件,应用程序都要为其提供一个超过400字节的虚拟函数分配表来实现对消息的响应。而采用 MFC的用宏将Windows消息映射到C++成员函数的方式则可避免产生庞大的虚拟函数分配表,其消耗的内存是同它所包含的消息入口数量成正比的。

    为了简化程序员的工作, MFC定义了一系列的消息映射宏和像AfxSig_vv这样的枚举变量,以及标准消息处理函数,并且具体地实现这些函数。这里主要讨论消息映射宏,常用的分为以下几类。

    1.用于 Windows消息的宏,前缀为“ON_WM_”。
    这样的宏不带参数,因为它对应的消息和消息处理函数的函数名称、函数原型是确定的。 MFC提供了这类消息处理函数的定义和缺省实现。每个这样的宏处理不同的Windows消息。
    例如:宏 ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函数,消息映射条目的第一个成员nMessage指定为要处理的Windows消息的ID,第二个成员nCode指定为0。

    2.用于命令消息的宏 ON_COMMAND

    这类宏带有参数,需要通过参数指定命令 ID和消息处理函数。这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0)。消息处理函数的原型是void (void),不带参数,不返回值。

    除了单条命令消息的映射,还有把一定范围的命令消息映射到一个消息处理函数的映射宏 ON_COMMAND_RANGE。这类宏带有参数,需要指定命令ID的范围和消息处理函数。这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0),第三个成员nID和第四个成员nLastID指定了映射消息的起止范围。消息处理函数的原型是void (UINT),有一个UINT类型的参数,表示要处理的命令消息ID,不返回值。

    3.用于控制通知消息的宏

    这类宏可能带有三个参数,如 ON_CONTROL,就需要指定控制窗口ID,通知码和消息处理函数;也可能带有两个参数,如具体处理特定通知消息的宏ON_BN_CLICKED、ON_LBN_DBLCLK、ON_CBN_EDITCHANGE等,需要指定控制窗口ID和消息处理函数。

    控制通知消息也被映射到 WM_COMMAND上,也就是将消息映射条目的第一个成员的nMessage指定为WM_COMMAND,但是第二个成员nCode是特定的通知码,第三个成员nID是控制子窗口的ID,第四个成员nLastID等于第三个成员的值。消息处理函数的原型是void (void),没有参数,不返回值。

    还有一类宏处理通知消息 ON_NOTIFY,它类似于ON_CONTROL,但是控制通知消息被映射到WM_NOTIFY。消息映射条目的第一个成员的nMessage被指定为WM_NOTIFY,第二个成员nCode是特定的通知码,第三个成员nID是控制子窗口的ID,第四个成员nLastID等于第三个成员的值。消息处理函数的原型是void (NMHDR*, LRESULT*),参数1是NMHDR指针,参数2是LRESULT指针,用于返回结果,但函数不返回值。

    对应地,还有把一定范围的控制子窗口的某个通知消息映射到一个消息处理函数的映射宏,这类宏包括 ON__CONTROL_RANGE和ON_NOTIFY_RANGE。这类宏带有参数,需要指定控制子窗口ID的范围和通知消息,以及消息处理函数。

    对于 ON__CONTROL_RANGE,是将消息映射条目的第一个成员的nMessage指定为WM_COMMAND,但是第二个成员nCode是特定的通知码,第三个成员nID和第四个成员nLastID等于指定了控制窗口ID的范围。消息处理函数的原型是void (UINT),参数表示要处理的通知消息是哪个ID的控制子窗口发送的,函数不返回值。

    对于 ON__NOTIFY_RANGE,消息映射条目的第一个成员的nMessage被指定为WM_NOTIFY,第二个成员nCode是特定的通知码,第三个成员nID和第四个成员nLastID指定了控制窗口ID的范围。消息处理函数的原型是void (UINT, NMHDR*, LRESULT*),参数1表示要处理的通知消息是哪个ID的控制子窗口发送的,参数2是NMHDR指针,参数3是LRESULT指针,用于返回结果,但函数不返回值。

    4.用于用户界面接口状态更新的ON_UPDATE_COMMAND_UI宏

    这类宏被映射到消息 WM_COMMND上,带有两个参数,需要指定用户接口对象ID和消息处理函数。消息映射条目的第一个成员nMessage被指定为WM_COMMAND,第二个成员nCode被指定为-1,第三个成员nID和第四个成员nLastID都指定为用户接口对象ID。消息处理函数的原型是 void (CCmdUI*),参数指向一个CCmdUI对象,不返回值。

    对应地,有更新一定 ID范围的用户接口对象的宏ON_UPDATE_COMMAND_UI_RANGE,此宏带有三个参数,用于指定用户接口对象ID的范围和消息处理函数。消息映射条目的第一个成员nMessage被指定为WM_COMMAND,第二个成员nCode被指定为-1,第三个成员nID和第四个成员nLastID用于指定用户接口对象ID的范围。消息处理函数的原型是 void (CCmdUI*),参数指向一个CCmdUI对象,函数不返回值。之所以不用当前用户接口对象ID作为参数,是因为CCmdUI对象包含了有关信息。

    5.用于其他消息的宏

    例如用于用户定义消息的 ON_MESSAGE。这类宏带有参数,需要指定消息ID和消息处理函数。消息映射条目的第一个成员nMessage被指定为消息ID,第二个成员nCode被指定为0,第三个成员nID和第四个成员也是0。消息处理的原型是LRESULT (WPARAM, LPARAM),参数1和参数2是消息参数wParam和lParam,返回LRESULT类型的值。

分享到:
评论

相关推荐

    MFC教程-消息映射的实现

    MFC教程-消息映射的实现,详细介绍了MFC消息映射机制

    MFC中消息映射机制分析

    MFC中消息映射机制分析!!MFC以层次结构组织起来,比较庞杂,尤其是它的消息映射机制,更是涉及到很多底层的东西。本文通过对整个消息映射机制进行系统的分析,可以帮助程序开发人员更好地了解MFC,进行可视化编程...

    MFC类库详解 结构、风格、回调函数和消息映射

    MFC类库详解 包括所以MFC类 MFC中的宏和全局函数、变量 结构、风格、回调函数和消息映射

    完整VC++教程ppt(含MFC具体应用)

    这种消息映射机制包括一组消息映射宏,用于把一个Windows 消息和其消息处理函数联系起来。MFC 应用程序框架提供了消息映射功能,所有从CCmdTarget 类派生出来的类都能够拥有自己的消息映射。 ……

    VC++之MFC类库中文手册.rar_MFC_face7x7_vc++_中文手册_类库

    MFC中文手册,MFC类,MFC宏,MFC全局,MFC结构,MFC风格,MFC回调函数,MFC消息映射

    VC++之MFC类库中文手册_目录保护_vc++之mfc_mfc类_VC++之MFC类库中文手册_MFC类库_

    该MFC参考含盖了Microsoft基本类库中的类、全局函数、全局变量和宏的内容。参考中“类层次结构图”是为了方便查找某个类... · 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。

    mfc教程(word版)

    4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4....

    深入解析MFC

    MFCCOM和接口映射宏 使用MFC的CoMath类 完成服务器的设计 MFC对类厂的支持 结语 第12章 统一数据传输和MFC 历史回顾 重要的结构 IDataObject接口 OLE剪贴板 MFC的IDataObjeot类 延迟供应 深入了解MFC的IDataObject类...

    MFC类库中文手册 chm,查阅方便快捷

    MFC类库手册,中文版,适用于新手、老手作为查阅手册,方便快捷。包含mfc类、宏和全局、结构风格、回调函数和消息映射

    精通MFC (光盘) 源代码

    6.5.3 控制通知消息映射宏 6.5.4 通知消息映射宏 6.5.5 反射消息映射宏 6.6 小结 第7章 消息处理 7.1 处理标准窗口消息 7.1.1 处理WM_CREATE消息 7.1.2 处理WM_DESTROY消息 7.1.3 处理WM_NCDESTORY消息 ...

    达内MFC笔记-消息映射的教学例子

    摘要:VC/C++源码,界面编程,MFC 达内MFC笔记-消息映射,消息映射添加。1 消息映射添加  1.1 在FrameWnd添加消息宏定义   DECLARE_MESSAGE_MAP  1.2 添加消息宏实现  BEGIN_MESSAGE_MAP( theClass, parentClass ...

    MFC-李进九 电子书籍完整版

    4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4....

    MFC类库详解(该MFC参考含盖了Microsoft基本类库中的类、全局函数、全局变量和宏的内容。)

    该MFC参考含盖了Microsoft基本类库中的类、全局函数、全局变量和宏的内容。 本书目录 · 层次结构图 直观的描述MFC中...· 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。

    MFC-class-library-(help-document).rar_MFC_MFC 类详解

    MFC类库详解(帮助文档) MFC类 MFC宏和全局 结构、风格、回调函数和消息映射

    MFC类库介绍-中文版.zip

    也许因为自己薄弱的英语基础,成为你研发路上的绊脚石; 也许你会因为对MFC某一个库的理解不够深入,而使得你的项目...· 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。

    MFC.rar_MFC_MFC类库

    自己收藏的全中文-MFC类库详解,包括MFC类,MFC宏,MFC全局,以及结构,风格,回调函数,消息映射等

    gd.rar_CFrameWnd_afxwin_afxwin.h_鼠标宏

    自己建立一个基于MFC的程序,并能对鼠标左键单击操作进行响应(弹出消息框)。 在程序编写过程中注意以下几点: (1) 建立工程的类型(Win32 Application)及需要包含的头文件... …//消息映射宏 END_MESSAGE_MAP

    VC新手之MFC类库详解

    · 层次结构图 直观的描述MFC中各类的关系。 · MFC类 详细解说MFC库中的每个类和头文件信息。... · 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。

    深入浅出MFC【侯捷】

    三个奇怪的宏,一张巨大的网 DECLARE_MESSAGE_MAP宏 消息映射网的形成:BEGIN…/ON…/END…宏 米诺托斯(Minotauros)与西修斯(Theseus) 二万五千里长征——消息的传递 直线上溯(一般Windows消息) 拐弯上溯(WM_...

    VC++基础 MFC类库详解

    详细讲解MFC的类、结构、宏和变量、回调函数、消息映射等内容,对学习MFC有帮助

Global site tag (gtag.js) - Google Analytics