我们以CListCtrl控件为例来分析WM_NOTIFY消息。

CListCtrl控件在Report样式下会包含CHeaderCtrl标头控件,即CHeaderCtrl标头控件为CListCtrl控件的子控件,所以不难理解,拖动CHeaderCtrl标头控件的列分隔栏会投递HDN_BEGINTRACK消息(WM_NOTIFY消息,通知码为HDN_BEGINTRACK)给其父窗口CListCtrl控件。

但是,我们在对话框窗口中也可以收到CHeaderCtrl标头控件的HDN_BEGINTRACK消息,这作何解释呢?

如下所示:我们在对话框窗口中响应HDN_BEGINTRACK消息,当开始拖动标头控件时,弹出消息框提示。

  1. BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)
  2. ......
  3. ON_NOTIFY(HDN_BEGINTRACK, 0, &CTestDlgDlg::OnHdnBegintrackList1)
  4. ......
  5. END_MESSAGE_MAP()
  6. void CTestDlgDlg::OnHdnBegintrackList1(NMHDR *pNMHDR, LRESULT *pResult)
  7. {
  8. LPNMHEADER phdr = reinterpret_cast<lpnmheader>(pNMHDR);
  9. // TODO: Add your control notification handler code here
  10. AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!"));
  11. *pResult = 0;
  12. }
  13. </lpnmheader>

效果如下:

在文章MFC消息处理流程概述中可知,CListCtrl控件窗口在接收到HDN_BEGINTRACK消息时,会调用以下代码处理:

  1. LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. // OnWndMsg does most of the work, except for DefWindowProc call
  4. LRESULT lResult = 0;
  5. if (!OnWndMsg(message, wParam, lParam, &lResult))
  6. lResult = DefWindowProc(message, wParam, lParam);
  7. return lResult;
  8. }

很显然,HDN_BEGINTRACK消息在CListCtrl的消息映射表中没有对应的消息处理函数处理,在CHeaderCtrl的消息映射表也无对应的反射消息处理函数处理,所以,以上代码OnWndMsg(message, wParam, lParam, &lResult)会返回FALSE,所以会交由默认的消息处理函数DefWindowProc(message, wParam, lParam)处理,该函数会将该消息投递给消息对应窗口(message.hwnd)的父窗口处理,即对话框窗口(当然,对应的message.hwnd变为了对话框窗口),这样对话框窗口才有机会处理该消息而弹出消息框。

如果在CListCtrl中处理了HDN_BEGINTRACK消息,则就不会交由对话框窗口处理。

为此,我们增加CMyListCtrl,继承自CListCtrl,在CMyListCtrl中处理HDN_BEGINTRACK消息。

  1. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
  2. ON_NOTIFY(HDN_BEGINTRACKA, 0, &CMyListCtrl::OnHdnBegintrack)
  3. ON_NOTIFY(HDN_BEGINTRACKW, 0, &CMyListCtrl::OnHdnBegintrack)
  4. END_MESSAGE_MAP()
  5. void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)
  6. {
  7. LPNMHEADER phdr = reinterpret_cast<lpnmheader>(pNMHDR);
  8. // TODO: Add your control notification handler code here
  9. AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));
  10. *pResult = 0;
  11. }
  12. </lpnmheader>

同时将对话框中的CListCtrl m_list改为CMyListCtrl m_list。则效果如下:

实例代码:http://download.csdn.net/detail/wangyao1052/4633804

http://blog.csdn.net/hisinwang/article/details/8057828

WM_NOTIFY消息流程实例分析的更多相关文章

  1. 自定义WM_NOTIFY消息

    自定义WM_NOTIFY消息 习惯了用自定义用户消息进行各种状态的通知,特别是子窗口与父窗口之间的交互.但ON_MESSAGE没有控件ID的限制,如果有多个子窗口发送同一个消息给父窗口时,父窗口就不知 ...

  2. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  3. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  4. Openfire注册流程代码分析

    Openfire注册流程代码分析 一.客户端/服务端注册用户流程 经过主机连接消息确认后,客户端共发送俩条XML完成注册过程.服务器返回两条XML. 注:IQ消息节点用于处理用户的注册.好友.分组.获 ...

  5. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  6. Eureka 系列(05)消息广播(上):消息广播原理分析

    Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...

  7. RPC原理及RPC实例分析(转)

    出处:https://my.oschina.net/hosee/blog/711632 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服 ...

  8. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  9. Linux I2C设备驱动编写(三)-实例分析AM3359

    TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1版本规格 支持标准模式(100K bits/s)和快速模式(400K bits/s) 多路接收.发送模式 ...

随机推荐

  1. Android中的Parcelable接口和Serializable使用方法和差别

    Parcelable接口: Interface for classes whose instances can be written to and restored from a Parcel. Cl ...

  2. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境

    打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...

  3. iOS_06_Mac os X

    Mac os X 系统简介 * 苹果公司专门为苹果电脑设计的操作系统. * 以坚如磐石的UNIX为基础,既简单易用且功能强大. * x 是一个罗马数字正式的发音位“十”(ten),连续了先前的Mac ...

  4. jquery 获取上一个兄弟元素和下一个兄弟元素

    jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点 jQuery.prevAll(),返回所有之前的兄弟节点 jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点 jQu ...

  5. Surging 微服务框架使用入门

    原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正.  我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...

  6. vue使用改变element-ui主题色

    每个项目的主题色一般都不一样,直接用element-ui的默认主题色似乎有点不合适,还需要自己一个一个的找元素class名然后在修改样式,非常麻烦,还容易影响到包含该类名的其他元素样式,所以需要自定义 ...

  7. [AngularJS] Using an AngularJS directive to hide the keyboard on submit

    Pleasea refer to Link <form ng-submit="foo()" handle-phone-submit> <input type=&q ...

  8. [Angular2 Form] patchValue, setValue and reset() for Form

    Learn how to update part of form model, full form model and reset whole form. We have form definetio ...

  9. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  10. sublime课程3 emmet插件中的常用符号有哪些

    sublime课程3 emmet插件中的常用符号有哪些 一.总结 一句话总结:emmet插件中的符号和css选择器里面哪些符号的意思很像. 1.+是干嘛的? 组合 2.{}是干嘛的? 标签里面的inn ...