64,648
社区成员
发帖
与我相关
我的任务
分享
#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;
}
AFX_MSGMAP class_name::messageMap = \
{ \
&(base_class_name::messageMap), (AFX_MSGMAP_ENTRY*)&(class_name::_messageEntries)\
};\