深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真命.doc_第1页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真命.doc_第2页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真命.doc_第3页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真命.doc_第4页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真命.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件英才网 软件行业驰名招聘网站命令传递(Command routing) 消息如果是仅仅从派生类流向父类,那就非常简单了。然而MFC用来处理消息的C+类,并不是单线发展的。document/view也具有处理消息的能力。因此,消息应该有横向流动的机会。 MFC对消息循环的规定为: 1:若是一般的windows消息(WM_xx)则一定是由派生类流向基类。 2:如果是WM_COMMAND消息,就非常复杂了。要区分接受者的类型: 1:接受者若为Frame窗口:处理次序为:View- Frame窗口本身-CWinApp类。 2:接受者若为View :处理次序为:View本身-Document; 3:接受者若为Document:处理次序为:Document本身-Document template 因此,接下来我们的任务就是仿真以上的消息传递路线。 以下为需要添加的函数: 全局函数AfxWndProc,它是整个消息循环的起始点,本来应该在CWinThread:Run中被调用,每调用一次就推送一个消息。模拟windows的disPatch函数。 LRESULT AfxWndPro(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam,CWnd *pWnd) coutAfxWndProc()endl; return AfxCallWndProc (pWnd,hWnd,nMsg,wParam,lParam);LRESULT AfxCallWndProc(CWnd*pWnd,HWND hWnd,UINT nMsg, WPARAM wParam,LPARAM lParam) coutAfxCallWndProcwindowProc(nMsg,wParam,lParam);return lResult;全局函数AfxCallWndProc用于调用接受消息的类的消息处理函数。pWnd-WindowProc调用哪个函数,取决于pWnd指向的对象类型。如果pWnd指向CMyFrameWnd对象,则调用CFrameWnd:WindowProc。因为CFrameWnd斌没有改写WindowProc,因此调用的是CWnd:WindowProc。 如果pWnd指向CMyView对象,那么调用CView:windowProc。而CMyView没有改写WIndowProc所以调用的是CWnd:WindowProc。 在CWnd:windowProc中,首先判断消息是否为WM_COMMAND消息, 如不是,则传递给父类进行处理。 如果是WM_COMMAND消息,CWnd:windowProc调用OnCommand。此函数为虚函数。有以下几种情况: 1:如果this指向CMyFrameWnd对象,则调用的是CFrameWnd:OnComamnd。 2:如果this指向CMyView对象,那么调用的是CView:OnCommand。因为CView并没有改写OnComamnd所以调用的是CWnd:OnCommand。bool CFrameWnd:OnComamnd(WPARAM wParam,LPARAM lParam) coutCFrameWnd:OnCommand()endl; return CWnd:OnCommand(wParam,lParam);bool CWnd:OnComamnd(WPARAM wParam,LPARAM lParam) coutCWnd:OnComamnd()endl; return OnCmdMsg(0,0); OnCmdMsg仍然是虚函数, 1:如果this指向CMyFrameWnd对象,那么调用的是CFrameWnd:OnCmdMsg。 2:如果this指向CMyView对象,则调用CView:OnCmdMsg。 3:如果this指向CMyDoc对象,则调用CDocument:OnCmdMsg。4:如果this指向CM与WinApp对象,则调用CWinApp: nCmdMsg。因为CWinApp没有改写OnCmdMsg因此调用的是CCmdTarget:OnCmdMsg。Bool CFrameWnd:OnCmdMsg(UINT nID,int nCode)coutCFrameWnd:OnCmdMsg()OnCmdMsg(nID,nCode)/处理则返回否则继续传递。 return true;if(CWnd:OnCmdMsg(nID,nCode) return true;CWinApp*pApp=AfxGetApp();if(pApp-OnCmdMsg(nID,nCode) return true;return fasle;bool CView:OnCmdMsg(UINT nID,int nCode) coutCView:OnCmdMsg()OnCmdMsg(nID,nCode); return bHandled;Bool CDocument:OnCmdMsg(UINT nID,int nCode) coutCDocument:OnCmdMsg()endl; if(CCmdTarget:OnCmdMsg(nID,nCode) return true; return false; 真正的消息传递路径是从OnCmdMsg开始的。在每个类的OnCmdMsg函数中,会调用其他类的OnCmdMsg函数,从而决定每个消息的传递路径。 如果消息在前一个OnCmdMsg中被处理,就不会继续传递。如果没有被处理,则会继续沿着路径传递下去。无论如何,最终消息的比对是在CCmdTarget类中进行的,只是调用GetMessageMap的this指针不同,会决定调用哪个类的消息映射

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论