BEGIN_MESSAGE_MAP()参数说明

本文详细介绍了MFC框架中的消息映射机制,包括如何使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏来定义消息映射,以及如何添加消息响应函数入口。此外还列举了常见的消息映射入口及其触发条件。

BEGIN_MESSAGE_MAP()

1 BEGIN_MESSAGE_MAP(CpassApp, CWinApp)
2     ON_COMMAND(ID_HELP, CWinApp::OnHelp)
3 END_MESSAGE_MAP()

这些都是宏定义,不是函数。
在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加你的消息响应函数,为 每个消息处理函数加入一个入口

 



BEGIN_MESSAGE_MAP( theClass, baseClass )

参数:
theClass指定消息映射所属的类的名字。
baseClass指定theClass的基类的名字。

说明:
使用BEGIN_MESSAGE_MAP宏开始你的消息映射的定义。
在你的类的成员函数的实现文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏开始消息映射,然后为每个消息处理函数加入一个入口,最后用END_MESSAGE_MAP宏结束消息映射。

每个消息映射入口的格式如下:
  ON_Notification(id, memberFxn)
  其中id指定了 发送通知的控件的子窗口的ID,而memberFxn指定了 处理该通知的父对象中的成员函数名
  父对象的函数原型格式如下:
  afx_msg void memberFxn( );

  可能的消息映射入口如下:
映射入口何时向父对象发送消息
ON_BN_CLICKED  用户单击按钮时
ON_BN_DOUBLECLICKED用户双击按钮时

例如:
1 BEGIN_MESSAGE_MAP(CpassDlg, CDialog)
2     ON_WM_SYSCOMMAND()
3     ON_WM_PAINT()
4     ON_WM_QUERYDRAGICON()
5      // }}AFX_MSG_MAP
6     ON_BN_CLICKED(IDOK, OnOK)
7     ON_BN_CLICKED(IDCANCEL, OnExit)
8 END_MESSAGE_MAP()

void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

这个函数响应系统控制菜单的命令.(即左上角图标处)。

OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.

另外:

DoDataExchange:当UpdateData时候

OnInitDialog:对话框类已经构造,但是对话框还没有显示出来的时候

OnQueryDragIcon:The framework calls this member function by a minimized (iconic) window that does not have an icon defined for its class. The system makes this call to obtain the cursor to display while the user drags the minimized window.
### `BEGIN_MESSAGE_MAP` 宏定义在 MFC 中的作用 在 MFC(Microsoft Foundation Classes)框架中,`BEGIN_MESSAGE_MAP` 是一个用于消息映射机制的核心宏定义。该宏用于声明一个类的消息处理函数映射表的开始部分,使得 MFC 能够将 Windows 消息路由到相应的类成员函数进行处理。消息映射机制是 MFC 实现事件驱动编程的基础。 `BEGIN_MESSAGE_MAP` 通常与 `END_MESSAGE_MAP` 配对使用,定义一个完整的消息映射表。在两者之间可以使用其他宏(如 `ON_WM_PAINT`、`ON_COMMAND` 等)来指定特定消息与处理函数之间的关联[^2]。 宏定义的展开形式如下: ```cpp #define BEGIN_MESSAGE_MAP(theClass, baseClass) \ PTM_WARNING_DISABLE \ const AFX_MSGMAP * theClass::GetMessageMap() const \ { return GetThisMessageMap(); } \ const AFX_MSGMAP * PASCAL theClass::GetThisMessageMap() \ { \ typedef theClass ThisClass; \ typedef baseClass TheBaseClass; \ static const AFX_MSGMAP_ENTRY _messageEntries[] = \ { ``` 该宏定义中包含以下关键结构: - 定义了 `GetMessageMap()` 函数,用于返回当前类的消息映射表指针。 - 定义了一个静态的 `AFX_MSGMAP_ENTRY` 数组 `_messageEntries`,用于存储消息与处理函数的映射条目。 - 通过 `typedef` 保留当前类和基类的类型信息,以支持消息映射的继承机制。 通过这种方式,MFC 在运行时能够根据窗口过程将 Windows 消息(如 `WM_PAINT`、`WM_COMMAND` 等)分发到相应的消息处理函数,而无需使用传统的 `switch-case` 语句来处理消息。 ### 示例代码 一个典型的使用 `BEGIN_MESSAGE_MAP` 的类定义如下: ```cpp class CMyDialog : public CDialog { public: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_WM_PAINT() END_MESSAGE_MAP() ``` 在上述代码中,`DECLARE_MESSAGE_MAP()` 声明了消息映射的存在,而 `BEGIN_MESSAGE_MAP` 和 `END_MESSAGE_MAP` 则定义了具体的消息映射表,`ON_WM_PAINT()` 表示将 `WM_PAINT` 消息映射到 `OnPaint()` 成员函数。 ### 总结 `BEGIN_MESSAGE_MAP` 宏定义在 MFC 中用于构建类的消息映射表,是实现消息驱动编程机制的核心机制之一。它通过宏展开的方式自动生成必要的类成员函数和数据结构,使得开发者可以以面向对象的方式处理 Windows 消息,同时保持代码的简洁性和可维护性[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值