消息映射

消息映射

一:为什么用消息映射
为了解决传统窗口函数的缺点,MFC引入了消息映射的概念。消息映射实际上是采用一张表(消息映射表),将消息标识和消息处理函数存储在其中,当调用窗口函数处理消息时,窗口函数搜索消息映射表,就可以调用消息映射表中对应消息的消息处理函数。
MFC就采用了上述的消息映射机制·它提供了一个消息映射的基类CCmdTarget,在CCmdTarget类中提供了一个消息映射表,以后与消息有关的类都应是CCmdTarget的派生类。这样,基类的消息映射表就可以与派生类的消息映射表连接起来。消息处理可以按着从派生类到基类的顺序搜索消息映射表。
二:消息映射表
为了构建消息映射表,MFC的设计者们提供了两个数据结构AFX_MSGMAP_ENTRY和AFX_MSGMAP。
AFX_MSGMAP_ENTRY结构定义如下:

struct AFX_MSGMAP_ENTRY(静态数组_messageEntries[]的每个元素的类型)
{
   
	UINT nMessage;   
	UINT nCode;      
	UINT nID;        
	UINT nLastID;    
	UINT_PTR nSig;       
	AFX_PMSG pfn;    
};
参数说明
nMessage:表示消息标识。
nCode:控制代码或WMNOTIFY通知代码。
nID:控件ID,如果是窗口消息,nID为0。
nLastID:表示一定范围的命令中的最后一个命令或控件ID,用于将一组命令映射到同一个消息处理函数中。
nSig:消息处理函数的类型。
pfn:表示消息处理的地址(指针)。

pfn所表示的函数原型如下:

typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);

在AFX_MSGMAP_ENTRY结构中,对于每一个消息nMessage,都有对应的消息处理函数pfn。对于不同的消息,其消息处理函数的参数个数、参数类型一般也不会相同·而在AFX_MSGMAP_ENTRY结构中,则定义了统一的消息处理函数pfn.在MFC内部定义了一个用于转换消息处理函数的联合体MessageMapFuncuons,该结构定义如下:

union MessageMapFunctions
{
   
	AFX_PMSG pfn;   
	void (AFX_MSG_CALL CCmdTarget::*pfnCmd_v_v)();
	BOOL (AFX_MSG_CALL CCmdTarget::*pfnCmd_b_v)();
	void (AFX_MSG_CALL CCmdTarget::*pfnCmd_v_u)(UINT);
	BOOL (AFX_MSG_CALL CCmdTarget::*pfnCmd_b_u)(UINT);
	.......//此处省略代码
	};

其中,pfn对应于AFX_MSGMAP_ENTRY结构的pfn成员·该联合体的作用是将统一的消息处理函数的指针转换为特定的形式·分析下面代码:

union MessageMapFunctions mmf;
mmf.pfn = lpEntry->pfn;
switch (lpEntry->nSig)
	{
   
	default:
		ASSERT(FALSE);
		break;
	case AfxSig_l_p:
		{
   
			CPoint point(lParam);
			lResult = (
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是一组用于开发 Windows 应用程序的 C++ 类库。在 MFC 中,消息映射是一种机制,用于将 Windows 消息与相应的消息处理函数关联起来。 消息映射是通过在类的消息映射表中定义消息处理函数来实现的。消息映射表是一个由宏定义和消息映射项组成的静态数组。每个消息映射项指定了一个 Windows 消息的 ID 和相应的消息处理函数。 消息处理函数是类中的成员函数,用于处理特定的 Windows 消息。当一个窗口接收到一个消息时,MFC 会根据消息映射表中的定义找到对应的消息处理函数,并执行该函数来处理该消息。 下面是一个简单的示例,展示了如何使用消息映射消息处理函数: ```cpp // 声明消息映射表 BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() // 定义消息处理函数 void CMyWnd::OnPaint() { // 处理 WM_PAINT 消息 // ... } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { // 处理 WM_LBUTTONDOWN 消息 // ... } ``` 在上面的示例中,`CMyWnd` 是一个继承自 `CWnd` 的自定义窗口类。通过在消息映射表中使用 `ON_WM_PAINT` 宏和 `ON_WM_LBUTTONDOWN` 宏,将 `OnPaint` 函数和 `OnLButtonDown` 函数与 `WM_PAINT` 消息和 `WM_LBUTTONDOWN` 消息关联起来。 当窗口接收到相应的消息时,就会调用对应的消息处理函数进行处理。 需要注意的是,消息映射表中的消息处理函数必须是类的成员函数,并且符合特定的函数签名。 希望这个简单的解释能够帮助你理解 MFC 中的消息映射消息处理机制。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值