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 },

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuanweihuayan/article/details/6878850
文章标签: mfc command
个人分类: MFC深入浅出
上一篇MFC深入浅出之动态创建---亦是宏的定义
下一篇C++内存管理
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭