MFC深入浅出之消息映射

 

struct AFX_MSGMAP 

{

AFX_MSGMAP* pBaseMessageMap;

AFX_MSGMAP_ENTRY* lpEntries;

};

struct AFX_MSGMAP_ENTRY

{

UINT nMessage;

UINT nCode;

UINT nID;

UINT nLastID;

UINT nSig;

AFX_PMSG pfn;

};

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

#define DECLARE_MESSAGE_MAP() \

static AFX_MSGMAP_ENTRY _messageEntries[]; \

static AFX_MSGMAP messageMap; \

virtual AFX_MSGMAP* GetMessageMap() const;)

#define BEGIN_MESSAGE_MAP( theClass,baseClass ) \

AFX_MSGMAP* theClass::GetMessageMap() const \

{ return &theClass::messageMap; }

AFX_MSGMAP theClass::messageMap = \

{ &( baseClass::messageMap ),\

(AFX_MSGMAP_ENTRY*)( &theClass::_messageEntries )  }; \

AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \

{

#define ON_COMMAND( id,memberFxn ) \

{ WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_vv,(AFX_PMSG)memberFxn },

#define END_MESSAGE_MAP() \

{ 0,0,0,0,AfxSig_end,( AFX_PMSG )0 } \

};

简单画个图:

这里只是给出了ON_COMMAND类型的消息,其实在MFC内部,ON_WM_开头的消息,在生成消息映射的时候也是以这种结构,甚至可以说是方法来组装起来的.

可以查看MFC里面的源码:OnPaint为例:

#define ON_WM_PAINT() \

{ WM_PAINT, 0, 0, 0, AfxSig_vv, \

(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&OnPaint },

自定义消息也是类似:

#define ON_MESSAGE(message, memberFxn) \

{ message, 0, 0, 0, AfxSig_lwl, \

(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值