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

  • 相关阅读:
    量子和量子化?
    ARM内核和架构都是什么意思,内核和架构的关系是什么?(转)
    线程,进程,协程
    关于Redis的问题
    python一些语法糖用法
    Python装饰器详解
    Python基础知识
    Pyinstaller安装以及参数使用
    正则表达式(特殊字符)/Xpath语法/CSS选择器
    还在为身份验证引入的Microsoft.AspNet.Identity.EntityFramework导致多上下文,生成的DB改名困扰吗?
  • 原文地址:https://www.cnblogs.com/xiejiulong/p/3818739.html
Copyright © 2011-2022 走看看