




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年办公设备维修工(中级)职业技能鉴定全真模拟试卷库全新全面升级
- 2025年车载空气净化器项目申请报告
- 经济学宏观分析与微观决策知识考点
- 品牌设计合作协议
- 儿童心理发育的关键里程碑和监测
- 2025年茶叶加工与评茶员(高级)茶叶加工工艺研究考试试卷
- 2025年俄语ТРКИ考试中级模拟试题
- 2025年一建《机电工程管理与实务》考试现场施工管理题库及答案解析
- 2025计算机辅助设计师考试计算机辅助设计智能机器人设计试题
- 2025年语言培训行业课程国际化教学策略研究报告
- 2025-2030年中国氯化聚醚行业市场现状分析及前景趋势调研报告
- 2023-2024学年人教(新起点)英语四年级下册期末综合素质模拟测试题(含答案含听力原文)
- 经济学基础-西方经济学 网考题库
- 品管圈PDCA改善案例-呼吸科提高住院患者痰标本送检合格率
- A型肉毒毒素在整形外科中的临床应用指南
- 2024年度艺人演出保密协议
- 临床成人失禁相关性皮炎的预防与护理团体标准解读
- 产品授权代理合同的续签与变更
- DB11-T 2010-2022 救灾物资储备管理规范
- 钢板桩安全技术交底
- 注水泵工(中级)技能鉴定理论考试题及答案
评论
0/150
提交评论