深入浅出MFC第2版(PDF格式)-第48部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
CCmdTarget::OnCmdMsg :
{
BOOL CCmdTarget::OnCmdMsg(UINT nID; int nCode)
{
cout lpEntries;
printlpEntries(lpEntry);
}
return FALSE; // not handled
}
196
…………………………………………………………Page 259……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
这是一个走访消息映射表的动作。注意,GetMessageMap 也是个虚拟函数(隐藏在
DECLARE_MESSAGE_MAP 宏定义中),所以它所得到的消息映射表将是this (以
目前而言是pMyVie w )所指对象的映射表。于是我们得到了这个结果:
pMyFrame received a WM_MAND; routing path and call stack:
AfxWndProc()
AfxCallWndProc()
CWnd::WindowProc()
CFrameWnd::Onmand()
CWnd::Onmand()
CFrameWnd::OnCmdMsg()
CFrameWnd::GetActiveView()
CView::OnCmdMsg()
CCmdTarget::OnCmdMsg()
1221 CMyView
122 CView
12 CWnd
1 CCmdTarget
如果在映射表中找到了对应的消息,就调用对应的处理例程,然后也就结束了二万五千
里长征。如果没找到,长征还没有结束,这时候退守回到CView::OnCmdMsg ,调用
CDocument::OnCmdMsg :
BOOL CDocument::OnCmdMsg(UINT nID; int nCode)
{
cout CCmdTarget::OnCmdMsg
GetMessageMap();
for(; pMessageMap != NULL;。。。) CView::OnCmdMsg
for(; pMessageMap != NULL;。。。) CView::OnCmdMsg
{ 。。。 }
{ 。。。 }
or CWnd::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
CDocument::OnCmdMsg
CDocument::OnCmdMsg
CDocument::OnCmdMsg
or
CCmdTarget::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
CCmdTarget::OnCmdMsg(。。。)
CCmdTarget::OnCmdMsg(。。。)
// walking the message map。
// walking the message map。
AFX_MSGMAP* pMessageMap = GetMessageMap();
AFX_MSGMAP* pMessageMap = GetMessageMap();
for(; pMessageMap != NULL;。。。) { 。。。 }
for(; pMessageMap != NULL;。。。) { 。。。 }
图3…7 当CMyFrameWnd 对象获得一个WM_MAND,所引起的Frame8
函数调用次序。
199
…………………………………………………………Page 262……………………………………………………………
第篇 勿在浮砂築高台
CObject CObject
CObject CObject
CCmdTarget CCmdTarget
CCmdTarget CCmdTarget
CWinThread CWinThread
CWinThread CWinThread
CWinApp CWinApp
CWinApp CWinApp
CMyWinApp CMyWinApp
CMyWinApp CMyWinApp
CWnd CWnd
CWnd CWnd
CView CView
CView CView
CMyView CMyView
CMyView CMyView
CFrameWnd CFrameWnd
CFrameWnd CFrameWnd
CMyFrameWnd CMyFrameWnd
CMyFrameWnd CMyFrameWnd
CDocument