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();