zoukankan      html  css  js  c++  java
  • MFC消息路由

    1.Command Routing(命令传递):当消息进来时,会有一个泵推动它前进.消息如何进来,以有泵函数如何推动,都是属于windows程序设计的范畴,
    消息如果是从子类流向父类(纵向流动),那么事情再简单不过,整个message map消息映射表已规划出十分明确的路线.消息应该有横向流动的机会,MFC对于消息循环的规定是:
    如果是一般的windows消息(WM_XXX),则一定是由派生类流向基类,没有旁流的可能.
    如果是命令消息(WM_COMMAND),那就有奇特的路线了.
     
    2.消息映射--窗口消息 
    DefWindowProc-->AfxWndProc-->AfxCallWndProc-->pWnd->WindowProc
     
    当消息到达pWnd->WindowProc()时即是调用 CWnd::WindowProc()接着调用 OnWndMsg(message, wParam, lParam, &LResult);
    在OnWndMsg()函数里,分别判断当前消息是什么消息,分别是WM_COMMAND或者WM_NOTIFY及标准windows消息
    如果是WM_COMMAND消息,又分为命令消息和来自窗口的控件通知消息,如果是命令消息直接调用OnCmdMsg(),此函数为虚函数,首先调用对话框本身的OnCmdMsg,在对话框本身的OnCmdMsg方法中会依次引起基类CDialog,CWnd和CCmdTarget的OnCmdMsg方法的调用,其中CCmdTarget的OnCmdMsg方法中主要搜索消息映射表,如果找到对应的处理函数,则调用_AfxDispatchCmdMsg方法执行消息映射表中的消息处理函数....如果是控件通知消息,则是判断传递进来的hWndCtrl!=NULL,成立则是控件通知消息,优先调用函数ReflectLastMsg(hWndCtrl)将这个消息反射给控件本身.
     
    不管是WM_NOTIFY消息还是来自WM_COMMAND的来自控件的通知消息都会优先调用ReflectLastMsg(hWndCtrl)
     
    再来看消息反射:在命令消息处理的WM_COMMAND和通知消息处理的WM_NOTIFY方法中优先调用ReflectLastMsg(),调用顺序为:pWnd->SendChildNotifyMsg(pResult)->return OnChildNotify->...._>return ReflectChildNotify()  此函数真正实现了消息反射,发送反射消息WM_COMMAND+WM_REFLECT_BASE或者WM_NOTIFY+WM_REFLECT_BASE最终此消息组全会被发送到OnCmdMsg,正如下面所说,这是一个虚函数,首先调用对话框本身的OnCmdMsg,在对话框本身的OnCmdMsg方法中依次调用引起基类的CDialog,CWnd和CCmdTarget类的OnCmdMsg方法(搜索消息映射表,直接调用消息映射函数);

     added by xiejl

  • 相关阅读:
    利用反射获取类的所有字段
    System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常
    sql server 修改列类型
    sql server 删除表字段和字段的约束
    sql server 查找字段上的约束
    ASP.NET MVC自定义路由
    初探pandas——索引和查询数据
    初探pandas——安装和了解pandas数据结构
    初探numpy——numpy常用通用函数
    初探numpy——广播和数组操作函数
  • 原文地址:https://www.cnblogs.com/xiejiulong/p/3818739.html
Copyright © 2011-2022 走看看