友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第59章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!