




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC中的消息路由2010-12-21 12:07windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。窗口消息大概是系统中最为常见的消息,它是指由操作系统和控制其他窗口的窗口所使用的消息。例如CreateWindow、DestroyWindow和MoveWindow等都会激发窗口消息,还有我们在上面谈到的单击鼠标所产生的消息也是一种窗口消息。命令消息,这是一种特殊的窗口消息,他用来处理从一个窗口发送到另一个窗口的用户请求,例如按下一个按钮,他就会向主窗口发送一个命令消息。控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 她类似于命令消息,当用户与控件窗口交互时,那么控件通知消息就会从控件窗口发送到它的主窗口。但是这种消息的存在并不是为了处理用户命令,而是为了让主窗口能够改变控件,例如加载、显示数据。例如按下一个按钮,他向父窗口发送的消息也可以看作是一个控件通知消息;单击鼠标所产生的消息可以由主窗口直接处理,然后交给控件窗口处理。其中窗口消息及控件通知消息主要由窗口类即直接或间接由CWND类派生类处理。相对窗口消息及控件通知消息而言,命令消息的处理对象范围就广得多,它不仅可以由窗口类处理,还可以由文档类,文档模板类及应用类所处理。mfc的消息传递时从子类开始,如果子类没有,再寻找父类的消息处理函数MFC程式的消息处理顺序MFC, 顺序, 程序MFC程式实际运用中处理消息的顺序1.AfxWndProc() 该参数负责接收消息,找到消息所属的CWndobject,然后调用AfxCallWndProc2.AfxCallWndProc() 该参数负责保存消息(保存的CONTENT 内容主要是消息标识符和消息参数)供程式实际运用以后实际运用,然后调用WindowProc()参数3.WindowProc() 该参数负责发送消息到OnWndMsg()参数,如果未被处理,则调用DefWindowProc()参数4.OnWndMsg() 该参数的功能首先按字节对消息停止排序,对于WM_comMAND消息,调用OnCommand()消息响应参数,对于WM_NOTIFY消息调用OnNotify()消息响应参数。任何被遗漏的消息将是唯一窗口消息。OnWndMsg()参数Search类的消息映像,以找到唯一能处理任何窗口消息的处理参数。如果OnWndMsg()参数无所不能找到那样的处理参数的话,则把消息返回到WindowProc()参数,由它将消息发送给DefWindowProc()参数5.OnCommand() 该参数查看这也许则唯一控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息否则控件通知),如果它是,OnCommand()参数会试图将消息映射到制造通知的控件;如果他否则唯一控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()参数6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()参数将在唯一称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是唯一框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找唯一消息处理参数MFC程式实际运用创建窗口的过程1.PreCreateWindow() 该参数是唯一重载参数,在窗口被创建前,没去外国疑问在该重载参数中改变创建参数(没去外国疑问设置窗口风格等等)2.PreSubclassWindow() 这也是唯一重载参数,允许首先子分类唯一窗口3.OnMinMaxInfo() 该参数为消息响应参数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸4.OnNcCreate() 该参数也是唯一消息响应参数,响应WM_NCCREATE消息,发送消息以告诉窗口的区即将被创建5.OnNcCalcSize() 该参数也是消息响应参数,响应WM_NCCALCSIZE消息,功能是允许改变窗口区大小6.OnCreate() 该参数也是唯一消息响应参数,响应WM_CREATE消息,发送消息告诉唯一窗口已经被创建7.OnSize() 该参数也是唯一消息响应参数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经除了变化8.OnMove() 消息响应参数,响应WM_MOVE消息,发送此消息说明窗口在移动9.OnChildNotify() 该参数为重载参数,作为部份消息映射被调用,告诉父窗口即将被告知唯一窗口刚刚被创建MFC程式实际运用关闭窗口的顺序(非模态窗口)1.OnClose() 消息响应参数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时间发送此消息2.OnDestroy() 消息响应参数,响应窗口的WM_DESTROY消息,当唯一窗口将被销毁时,发送此消息3.OnNcDestroy() 消息响应参数,响应窗口的WM_NCDESTROY消息,当唯一窗口被销毁后发送此消息4.PostNcDestroy() 重载参数,作为处理OnNcDestroy()参数的最后动作,被CWnd调用MFC程式实际运用中打开模式对话框的参数调用顺序1.DoModal() 重载参数,重载DoModal()成员参数2.PreSubclassWindow() 重载参数,允许首先子分类唯一窗口3.OnCreate() 消息响应参数,响应WM_CREATE消息,发送此消息以告诉唯一窗口已经被创建4.OnSize() 消息响应参数,响应WM_SIZE消息,发送此消息以告诉窗口大小除了变化5.OnMove() 消息响应参数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动6.OnSetFont() 消息响应参数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体7.OnInitDialog() 消息响应参数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件8.OnShowWindow() 消息响应参数,响应WM_SHOWWINDOW消息,该参数被ShowWindow()参数调用9.OnCtlColor() 消息响应参数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify() 重载参数,作为WM_CTLCOLOR消息的结果发送MFC程式实际运用中关闭模式对话框的顺序1.OnClose() 消息响应参数,响应WM_CLOSE消息,当关闭按钮被单击的时间,该参数被调用2.OnKillFocus() 消息响应参数,响应WM_KILLFOCUS消息,当唯一窗口即将失去键盘输入焦点以前被发送3.OnDestroy() 消息响应参数,响应WM_DESTROY消息,当唯一窗口即将被销毁时,被发送4.OnNcDestroy() 消息响应参数,响应WM_NCDESTROY消息,当唯一窗口被销毁以后被发送5.PostNcDestroy() 重载参数,作为处理OnNcDestroy()参数的最后动作被CWnd调用打开无模式对话框的顺序1.PreSubclassWindow() 重载参数,允许用户首先子分类唯一窗口2.OnCreate() 消息响应参数,响应WM_CREATE消息,发送此消息以告诉唯一窗口已经被创建3.OnSize() 消息响应参数,响应WM_SIZE消息,发送此消息以告诉窗口大小除了变化4.OnMove() 消息响应参数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动5.OnSetFont() 消息响应参数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体以上这一些的运行都是按给定的顺序运行!只有清楚的了解程式实际运用的运行顺序,才能在编写代码的时间清楚,在什么时间因该运行什么,以及在什么地方该处理什么!这只是一自己总结的一点小小的亲身经历,期望能对MFC的新手者有所帮助!MFC框架中WM_COMMAND消息响应顺序(2009-04-28 13:49:35)标签:it 分类:MFC在MFC开发的程序中,菜单、工具条按钮等都会产生WM_COMMAND消息。而在MFC的Document/View框架中,有很多类可以响应WM_COMMAND消息,分别是框架类:CFrameWnd、CMDIChildWnd、CMDIFrameWnd;应用程序类CWinApp;文档类CDocument;以及视图类CView。当应用程序主菜单发送了一个WM_COMMAND消息时,WM_COMMAND消息将会按一定顺序被交这些类的实例,并调用第一个发现的响应函数。以多文档视图框架应用程序为例,我们可以分析MFC中这些类的源代码,并一步一步找出WM_COMMAND消息的响应顺序。因为框架窗口是菜单的父窗口,所以消息首先发到CMDIFrameWnd类的实例(也就是主框架窗口,通常为CMainFrame)。CMDIFrameWnd类的OnCmdMsg函数如下:BOOL CMDIFrameWnd:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo). CMDIChildWnd* pActiveChild = MDIGetActive(); / pump through active child FIRST if (pActiveChild != NULL) . CPushRoutingFrame. push(this); if (pActiveChild-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; / then pump through normal frame return CFrameWnd:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);主框架窗口CMDIFrameWnd先查找当前活动的子框架窗口CMDIChildWnd,让其优先访问,然后调用基本框架窗口CFrameWnd的响应函数。所以响应优先级:子框架窗口CMDIChildWnd 主框架窗口CMDIFrameWndCMDIChildWnd窗口没有重载OnCmdMsg函数,所以使用基本框架窗口CFrameWnd的OnCmdMsg函数:BOOL CFrameWnd:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo). CPushRoutingFrame. push(this); / pump through current view FIRST CView* pView = GetActiveView(); if (pView != NULL & pView-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; / then pump through frame if (CWnd:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; / last but not least, pump through app CWinApp* pApp = AfxGetApp(); if (pApp != NULL & pApp-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; return FALSE;基本框架窗口先让当前活动视图CView响应函数,然后再查找自己的消息响应表(调用CWnd:OnCmdMsg),最后让应用程序处理该消息。所以得出顺序:存在打开的视图时,视图CView 子框架CFrame. 应用程序CWinApp 主框架窗口CMDIFrameWnd没有打开视图时,主框架窗口CMDIFrameWnd 应用程序CWinApp再看视图CView类对OnCmdMsg的处理:BOOL CView:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo). / first pump through pane if (CWnd:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; / then pump through document if (m_pDocument != NULL) . / special state for saving view before routing to document CPushRoutingView push(this); return m_pDocument-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); return FALSE;视图类首先查找自己的消息响应表(调用CWnd:OnCmdMsg),然后让视图对应的CDocument类处理消息。所以可以得出如下顺:视图CView 文档CDocument 子框架CFrame. 应用程序CWinApp 主框架窗口CMDIFrameWnd再查看CDocument的OnCmdMsg的实现代码:BOOL CDocument:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo). if (CCmdTarget:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; / otherwise check template if (m_pDocTemplate != NULL & m_pDocTemplate-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) return TRUE; return FALSE;文档类CDocument首先查找自己的响应函数(调用CCmdTarget:OnCmdMsg),然后让其成员m_pDocTemplate来处理。m_pDocTemplate是文档模板类CDocTemplate的指针,MFC框架使用文档模板来实现自动化的文档管理。在应用程序开发过程中,没有针对文档模板类的编程。查看CDocTemplate类中OnCmdMsg的实现:BOOL CDocTemplate:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo). BOOL bReturn; CCmdTarget* pFactory = DYNAMIC_DOWNCAST(CCmdTarget, m_pAttachedFactory); if (nCode = CN_OLE_UNREGISTER & pFactory != NULL) bReturn = pFactory-OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); else bReturn = CCmdTarget:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); return bReturn;因为应用程序中并没有开发直接从CDocTemplate继承的类,所以应用程序无法使用CDocTemplate的子类定义WM_COMMAND消息的响应函数。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州省独山县2025年上半年事业单位公开遴选试题含答案分析
- 骨关节炎炎症细胞机制解析-洞察及研究
- 后溪穴艾灸炎症机制-洞察及研究
- 灌肠相关课件
- 知识型员工培训开题报告课件
- 知识员工培训记忆问题
- 知识分享培训班课件
- 知识付费直播运营培训课件
- 2025年高校体育管理人才招聘考试试题及答案
- 2025年福建省国家公务员考试《行政职业能力测试》真题及答案解析
- 2025年湖南湘西自治州州直事业单位招聘考试笔试试卷附答案
- 幼儿园安全责任书及后勤管理制度
- 消防车辆事故课件
- 2026届四川省宜宾市普通高中高一化学第一学期期末统考试题含解析
- 《2型糖尿病中医防治指南(2024版)》解读课件
- 剑阁县普安镇污水处理厂扩容建设项目环评报告
- 商务楼宇管理办法
- 肺炎护理试题填空及答案
- 社用手机管理办法
- 心电监护操作常见并发症预防及处理
- 学校食堂各种检查记录表格表册11
评论
0/150
提交评论