首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-11 
《深入浅出MFC》 中相关疑问?(消息传递)在MFC 中的消息传递‘一般’是从子类流向父类的。其中CWinThread类并不

《深入浅出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》 中相关疑问?(消息传递)

热点排行