深入浅出MFC第2版(PDF格式)-第47部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
时不管。我现在要仿真出消息的流动绕行路线…我常喜欢称之为消息的「二万五千里长
征」。
消息如果是从子类别流向父类别(纵向流动),那么事情再简单不过,整个Message Map
消息映射表已规划出十分明确的路线。但是正如上一节一开始我说的,MFC 之中用来处
理消息的C++ 类别并不呈单鞭发展,作为application framework 的重要架构之一的
document/view ,也具有处理消息的能力(你现在可能还不清楚什么是document/view ,没
有关系);因此,消息应该有横向流动的机会。MFC 对于消息绕行的规定是:
如果是一般的Windows 消息(WM_xxx),一定是由衍生类别流向基础类别,
没有旁流的可能。
如果是命令消息WM_MAND,就有奇特的路线了:
命令消息接收物的类型 处理次序
Frame 1。 View
窗口
2。 Frame 窗口本身
3。 CWinApp 对象
View 1。 View 本身
2。 Document
Document 1。 Document 本身
2。 Document Template
目前我们还不知道什么是Document Template ,但是没有关系
第9章将解开虚线跳跃之谜
图3…6 MFC 对于命令消息WM_MAND 的特殊处理顺序。
191
…………………………………………………………Page 254……………………………………………………………
第篇 勿在浮砂築高台
不管这个规则是怎么定下来的,现在我要设计一个推动引擎,把它仿真出来。以下这些
函数名称以及函数内容,完全仿真MFC 内部。有些函数似乎赘余,那是因为我删掉了
许多主题以外的动作。不把看似赘余的函数拿掉或合并,是为了留下MFC 的足迹。此
外,为了追踪调用过程(call stack ),我在各函数的第一行输出一串识别文字。
首先我把新增加的一些成员函数做个列表:
类别 与消息绕行有关的成员函数 注意
none AfxWndProc global
none AfxCallWndProc global
CCmdTarget OnCmdMsg virtual
CDocument OnCmdMsg virtual
CWnd WindowProc virtual
Onmand virtual
DefWindowProc virtual
CFrameWnd Onmand virtual
OnCmdMsg virtual
CView OnCmdMsg virtual
全域函数AfxWndProc 就是我所谓的推动引擎的起始点。它本来应该是在
CWinThread::Run 中被调用,但为了实验目的,我在main 中调用它,每调用一次便推
送一个消息。这个函数在MFC 中有四个参数,为了方便,我加上第五个,用以表示是
谁获得消息(成为绕行的起点)。例如:
AfxWndProc(0; WM_CREATE; 0; 0; pMyFrame);
表示pMyFrame 获得了一个WM_CREATE,而:
AfxWndProc(0; WM_MAND; 0; 0; pMyView);
表示pMyView 获得了一个WM_MAND。
192
…………………………………………………………Page 255……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
下面是消息流动的过程:
LRESULT AfxWndProc (HWND hWnd; UINT nMsg; WPARAM wParam; LPARAM lParam;
CWnd *pWnd) // last param。 pWnd is added by JJHou。
{
cout lpEntries;
printlpEntries(lpEntry);
}
return 0; // J。J。Hou: if find; should call lpEntry…》pfn;
// otherwise should call DefWindowProc。
// for simplification; we just return 0。
}
如果消息是WM_MAND,CWnd::WindowProc 调用 Onmand 。好,注意了,
这又是一个CWnd 的虚拟函数:
1。 如果this 指向CMyFrameWnd 对象,那么调用的是CFrameWnd::Onmand 。
2。 如果this 指向CMyView 对象,那么调用的是CView::Onmand 。而因为CView
并没有改写Onmand,所以调用的其实是CWnd::Onmand 。
这次可就没有殊途同归了。
我们以第一种情况为例,再往下看:
194
…………………………………………………………Page 257……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
BOOL CFrameWnd::Onmand(WPARAM wParam; LPARAM lParam)
{
cout