刚刚看了《深入浅出MFC》关于消息映射表和消息实际流动的章节,很受启发,不过仍旧有两个问题,可能我没留心看到。
1.为什么“要把消息一般分为windows消息和WM_COMMAND消息两种”,并对两种消息设计不同的消息处理顺序?
2.以Frame视窗为例,(WM_COMMAND)的消息流动顺序似乎是(从左至右,我按照191页的图写的)
{View(view本身,Document)}Frame视窗本身,CWinApp物件
我一直以为windows消息那种按照类别的继承关系流动就足以解决问题,还请高手说明WM_COMMAND这样的消息流动次序有什么道理在里面,谢谢3.另外,这里是RTTI中的问题
整組巨集看起來有點嚇㆟,其實也沒有什麼,文字代換而已。現在看看這個實例:
// in header file
class CView : public CWnd
{
DECLARE_DYNAMIC(CView)
...
};
// in implementation file
IMPLEMENT_DYNAMIC(CView, CWnd)
㆖述的碼展開來成為:
// in header file
class CView : public CWnd
{
public:
static CRuntimeClass classCView; \
virtual CRuntimeClass* GetRuntimeClass() const;
...
};
// in implementation file
static char _lpszCView[] = "CView";
CRuntimeClass CView::classCView = {
_lpszCView, sizeof(CView), 0xFFFF, NULL,
&CWnd::classCWnd, NULL };
static AFX_CLASSINIT _init_CView(&CView::classCView);
CRuntimeClass* CView::GetRuntimeClass() const
{ return &CView::classCView; }
於是乎, 程式㆗只需要簡簡單單的兩個巨集DECLARE_DYNAMIC(Cxxx) 和
IMPLEMENT_DYNAMIC(Cxxx, Cxxxbase) ,就完成了建構資料並加入串列的工作:
“Cxxx”
sizeof(Cxxx)
0xFFFF
m_pfnCreateObject
m_pNextClass
m_pBaseClass
Cxxx::classCxxx
NULL
Cxxxbase::classCxxxbase
可是你知道,串列的頭,總是需要特別費心處理,不能夠套用㆒般的串列行為模式。我
們的類別根源 CObject , 不能套用現成的巨集 DECLARE_DYNAMIC 和
IMPLEMENT_DYNAMIC,必須特別設計如㆘:// in header file这里小弟没看出来两者的代码除了初始化FirstClass不同外,还有什么区别,没看出什么特别设计,请高手指点,谢谢
class CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const;
...
public:
static CRuntimeClass classCObject;
};// in implementation file
static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject =
{ szCObject, sizeof(CObject), 0xffff, NULL, NULL };
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
CRuntimeClass* CObject::GetRuntimeClass() const
{
return &CObject::classCObject;
}
並且,CRuntimeClass ㆗的 static 成員變數應該要初始化(如果你忘記了,趕快複習第
2章的「靜態成員(變數與函式)」㆒節):
// in implementation file
CRuntimeClass* CRuntimeClass::pFirstClass = NULL;
原文摘自深入浅出MFC P126-128