读书人

《深入显出MFC》 中相关疑问?(消息传

发布时间: 2013-01-11 11:57:35 作者: rapoo

《深入浅出MFC》 中相关疑问?(消息传递)
在MFC 中的消息传递‘一般’是从子类流向父类的。
其中CWinThread类并不在‘消息传递网’ 中。
模拟代码主要如下:


#include <iostream>
#include<Windows.h>
#include <string>

using namespace std;


#define RUNTIME_CLASS_NAME(class_name) \
(#class_name )

enum ID
{
CObjectid = 0,
CCmdTergetid = 1,
CWinThreadid = 11,CWinAppid = 111,
CWndid = 12,CViewid = 121,CFrameWndid = 122
};

struct AFX_MSGMAP_ENTRY
{
char* pName;
ID id;

};
struct AFX_MSGMAP {

AFX_MSGMAP* pBaseMessageMap;

AFX_MSGMAP_ENTRY* lpEntry;
};

#define ClassName(class_name) #class_name
#define Classid(class_name) class_name##id

#define DECLARE_MESSAGE_MAP() \
static AFX_MSGMAP_ENTRY _messageEntries[];\
static AFX_MSGMAP messageMap;\
virtual AFX_MSGMAP* GetMessageMap() const;


#define BEGIN_MESSAGE_MAP(class_name, base_class_name) \
AFX_MSGMAP* class_name::GetMessageMap() const\
{return &class_name::messageMap;} \
AFX_MSGMAP class_name::messageMap = \
{\
&(base_class_name::messageMap), (AFX_MSGMAP_ENTRY*)&(class_name::_messageEntries)\
};\
AFX_MSGMAP_ENTRY class_name::_messageEntries[] = {\
ClassName(class_name), Classid(class_name)\
};

class CObject
{

};

class CCmdTerget : public CObject
{

public:
DECLARE_MESSAGE_MAP()
};

AFX_MSGMAP CCmdTerget::messageMap= {NULL, CCmdTerget::_messageEntries};
AFX_MSGMAP_ENTRY CCmdTerget::_messageEntries[] = {ClassName(CCmdTerget),Classid(CCmdTerget)};
AFX_MSGMAP* CCmdTerget::GetMessageMap()const{ return NULL; }

//-
class CWinThread : public CCmdTerget
{

public:


};

class CWinApp : public CWinThread
{

public:
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CWinApp, CWinThread)

//-
class CWnd : public CCmdTerget
{

public:
DECLARE_MESSAGE_MAP()

};
BEGIN_MESSAGE_MAP(CWnd, CCmdTerget)

//
class CView: public CWnd
{

public:
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CView,CWnd)

//
class CFrameWnd : public CWnd
{

public:
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CFrameWnd, CWnd)
//////////////////////////////////////////////////////////////////////////

void Print(AFX_MSGMAP_ENTRY* pEntry)
{
AFX_MSGMAP_ENTRY ame[] =
{
{"CObject",CObjectid} ,
{"CCmdTerget",CCmdTergetid} ,
{"CWinThread",CWinThreadid},
{"CWinApp",CWinAppid},
{"CWnd",CWndid} ,
{"CView" ,CViewid},
{"CFrameWnd",CFrameWndid}
};

for (UINT index = 0; index < sizeof(ame)/sizeof(ame[0]); index++)
{
if (strcmp(pEntry->pName,ame[index].pName ) ==0)
{
cout<<ame[index].pName<<" "<<ame[index].id<<endl;
}


}
return;
}

void MsgPrint(AFX_MSGMAP* pMsg)
{
for (; pMsg != NULL; pMsg = pMsg->pBaseMessageMap)
{
if (pMsg->lpEntry)
{
Print(pMsg->lpEntry);
}
}

return;
}


int main( )
{
CWinApp ca;
AFX_MSGMAP* pCa = ca.GetMessageMap();
MsgPrint(pCa);

return 0;
}




//---------------------------------------
主要的疑问就是,子类是通过 pBaseMessageMap 去访问 父类 中的 messageMap
(即,这段代码 
              
[解决办法]
《深入显出MFC》 中相关疑问?(消息传递)

读书人网 >C++

热点推荐