按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
WPARAM wParam; LPARAM lParam)
{
cout WindowProc 究竟是调用哪一个函数?不一定,得视pWnd 到底指向何种类别之
对象而定…别忘了WindowProc 是虚拟函数。这正是虚拟函数发挥它功效的地方呀:
如果pWnd 指向CMyFrameWnd 对象,那么调用的是CFrameWnd::WindowProc。
而因为CFrameWnd 并没有改写WindowProc , 所以调用的其实是
CWnd::WindowProc。
如果pWnd 指向CMyView 对象,那么调用的是CView::WindowProc。而因为CView
并没有改写WindowProc,所以调用的其实是CWnd::WindowProc。
虽然殊途同归,意义上是不相同的。切记!切记!
CWnd::WindowProc 首先判断消息是否为WM_MAND。如果不是,事情最单纯,
就把消息往父类别推去,父类别再往祖父类别推去。每到一个类别的消息映射表,原本
应该比对AFX_MSGMAP_ENTRY 的每一个元素,比对成功就调用对应的处理例程。不
过在这里我不作比对,只是把AFX_MSGMAP_ENTRY 中的类别识别代码印出来(就像上
一节的Frame7 程序一样),以表示「到此一游」:
193
…………………………………………………………Page 256……………………………………………………………
第篇 勿在浮砂築高台
LRESULT CWnd::WindowProc(UINT nMsg; WPARAM wParam; LPARAM lParam)
{
AFX_MSGMAP* pMessageMap;
AFX_MSGMAP_ENTRY* lpEntry;
if (nMsg == WM_MAND) // special case for mands
{
if (Onmand (wParam; lParam))
return 1L; // mand handled
else
return (LRESULT)DefWindowProc (nMsg; wParam; lParam);
}
pMessageMap = GetMessageMap();
for (; pMessageMap != NULL;
pMessageMap = pMessageMap…》pBaseMessageMap)
{
lpEntry = pMessageMap…》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