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

MFC消息路由的更多相关文章

  1. Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析

    Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...

  2. Visual C++中MFC消息的分类

    Visual C++中MFC消息的分为三类:标准(窗口)消息.命令消息.控件消息. 1.标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或 ...

  3. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  4. 自制MFC消息响应定位器+原理分析

    mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...

  5. BizTalk动手实验(八)消息路由

    1 课程简介 通过本课程熟悉BizTalk消息由的机制 2 准备工作 1. 熟悉XML.XML Schema.XSLT等相关XML开发技术 2. 新建BizTalk空项目 3 演示 3.1 动态消息路 ...

  6. MFC编程入门之五(MFC消息映射机制概述)

    在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...

  7. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  8. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  9. MFC消息映射机制

    1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...

随机推荐

  1. cocos creator 倒计时code

    let countDownNode = this.viewNode.getChildByName('countDownNode').getComponent(cc.Label); countDownN ...

  2. Linux程序Segmentation fault (core dumped)

    1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成.空指针.野指针的读写操作,数组越界访问,破坏常量等.对每个指针声明后进行初始化为NULL是避免这个问 ...

  3. 有四个数字能组成多少个互不相同的三位数 --Python

    有四个数字能组成多少个互不相同的三位数? num = 0 for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if i ...

  4. Spark简介 --大数据

    一.Spark是什么? 快速且通用的集群计算平台 二.Spark的特点: 快速:Spark扩充流行的Mapreduce计算模型,是基于内存的计算 通用:Spark的设计容纳了其它分布式系统拥有的功能, ...

  5. v-bind 绑定属性

    与mustache相区别,他是对内容(content内部)进行修改的.v-bind的语法糖写法是   : v-bind 动态绑定class属性:v-bind:class="对象名" ...

  6. error PRJ0003 : 生成“rc.exe”时出错

    完美解决 visual studio 2008运行时 error PRJ0003 : 生成“rc.exe”时出错 步骤如下 : 1.运行vs2008安装程序,点击安装或删除程序.在“选择要安装的功能” ...

  7. hadoop--Unable to load native-hadoop library for your platform解决方法

    笔者实验环境:centos 7.4.1708,hadoop-2.6.0-cdh5.14.2. 执行hadoop命令时出现以下告警,不能加载相关库: WARN util.NativeCodeLoader ...

  8. MySQL的sql语言分类DML、DQL、DDL、DCL

    SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...

  9. 【动态规划】Überwatch

    Überwatch 题目描述 The lectures are over, the assignments complete and even those pesky teaching assista ...

  10. Windows计划任务无法写Log的问题

    参照:https://www.cnblogs.com/jonezzz/p/10364153.html 使用WIndows计划任务去执行Exe文件时无法写Log,而Exe双击执行就能写Log,这是由于计 ...