有关MFC消息映射表

MFC的消息映射机制和Win32的消息映射机制的编写有很大的不同。 Win32 是在消息处理函数中直接通过switch case 来找到每个消息相对应的消息处理函数。 

而MFC则是采用了宏定义的方式,简化了消息函数与消息的函数的编写

以下是我从MSDN中截取的如何在MFC中简历相应的消息映射表

// example for DECLARE_MESSAGE_MAP
class CMyWnd : public CFrameWnd
{
    // Member declarations
    
    DECLARE_MESSAGE_MAP( )
};

// example for BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP( CMyWindow, CFrameWnd )
   //{{AFX_MSG_MAP( CMyWindow )
    ON_WM_PAINT()
    ON_COMMAND( IDM_ABOUT, OnAbout )
   //}}AFX_MSG_MAP
END_MESSAGE_MAP( )
下面在解释下  通过宏代换后  程序中所插入的代码


class CMyWnd: public CFrameWnd{
	DECLARE_MESSAGE_MAP()
}
BEGIN_MESSAGE_MAP(CMsgFrame, CFrameWnd)
	ON_MESSAGE(WM_PAINT, OnPaint)
	ON_WM_CREATE()
END_MESSAGE_MAP()


//声明了一个静态函数 GetThisMessageMap();
//声明了一个虚函数 GetMessageMap()
class CMyWnd: public CFrameWnd{
	#define DECLARE_MESSAGE_MAP() 
	protected: 
		static const AFX_MSGMAP* PASCAL GetThisMessageMap(); 
		virtual const AFX_MSGMAP* GetMessageMap() const; 
}                

#define BEGIN_MESSAGE_MAP(theClass, baseClass) 

//实现了虚函数GetMessageMap()的函数内容-> 就是直接调用GetThisMessageMap()
TM_WARNING_DISABLE 
const AFX_MSGMAP* theClass::GetMessageMap() const { 
	return GetThisMessageMap(); 
} 

//实现了GetThisMessage的内容  
// 给theClass和baseClass 起了别名,分别叫 ThisClass 和 TheBaseClass  
//然后定义一个以AFX_MSGMAP_ENTRY为数据类型的数组_messageEntries  实现了消息和函数的映射
//下面是AFX_MSGMAP_ENTRY的定义  定义中nMessage消息和pfn函数形成了一一对应的关系
//struct AFX_MSGMAP_ENTRY
//{
//	UINT nMessage;   // windows message
//	UINT nCode;      // control code or WM_NOTIFY code
//	UINT nID;        // control ID (or 0 for windows messages)
//	UINT nLastID;    // used for entries specifying a range of control id's
//	UINT_PTR nSig;       // signature type (action) or pointer to message #
//	AFX_PMSG pfn;    // routine to call (or special value)
//};



const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() { 
	typedef theClass ThisClass;						   
	typedef baseClass TheBaseClass;					   
	static const AFX_MSGMAP_ENTRY _messageEntries[] =  {
// 将消息ID和消息相应函数的映射放到了_messageEntries 数组中
#define ON_MESSAGE(message, memberFxn) 
	{ message, 0, 0, 0, AfxSig_lwl, (AFX_PMSG)(AFX_PMSGW) (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > (memberFxn)) },

//将终止映射的变量同样放入_messageEntries数组中, 并生成了messageMap变量,其中包括映消息映射和本函数的地址
// 定义的虚函数可以通过静态函数调用,静态函数可以通过类直接调用。virtual function -> static function -> class::static function
#define END_MESSAGE_MAP() 
		{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } }; 
		static const AFX_MSGMAP messageMap = { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; 
		return &messageMap; 
	}								  
	PTM_WARNING_RESTORE





DECLARE_MESSAGE_MAP();















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值