我们以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. PAL相机

    输入时钟:27M PCLK:54M SDRAM时钟:80M ADV7393时钟:27M 1024*768 60帧    65MHZ

  2. 去哪网实习总结:用到的easyui组件总结(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享 ...

  3. 飞镖忍者 quick-cocos2d-x3.2

    经典的入门小游戏.这里用quick-cocos2d-x3.2又一次写一遍,以便熟悉下quick 首先,创建project,假设不会自行百度啊. 1.编译效果例如以下: watermark/2/text ...

  4. KDE Plasma 5.8 的 LTS 周期正好与其所采用的 Qt 5.6 的 LTS 周期一致

    在 KDE Plasma 5.7 刚刚发布不久,KDE 开发团队就宣布了 KDE Plasma 5.8 的开发计划.这个版本将是一个 LTS 版本,据我所知,这应该是 KDE 历史上第一个 LTS 版 ...

  5. [array] leetCode-18. 4Sum -Medium

    18. 4Sum -Medium descrition Given an array S of n integers, are there elements a, b, c, and d in S s ...

  6. POJ 1887 Testing the CATCHER(LIS的反面 最大递减子序列)

    Language: Default Testing the CATCHER Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1 ...

  7. linux系统下安装与配置apache

    搭建环境:VMware上虚拟的linux 主机:win  7 安装linux下的Apache前准备: 1.httpd服务的配置文件,默认存储路径:/etc/httpd/conf/httpd.conf( ...

  8. bitnami WAMP stack使用方法(转)

    想学习PHP,在网上找了些资料看了一下.介绍一个简单快速的服务器搭建方法,基于WAMP(WINDOWS+APATCH_MYSQL/MARIADB+PERL/PHP/PYTHON)架构.对应的也有LAM ...

  9. [RxJS] Convert RxJS Subjects to Observables

    The use of RxJS Subjects is common, but not without problems. In this lesson we will see how they ca ...

  10. Oracle null 处理

    null first null last 解决啦-