当前位置: 首页 > news >正文

WM_NOTIFY消息流程实例分析 .

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

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

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

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

void CTestDlgDlg::OnHdnBegintrackList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMHEADER phdr = reinterpret_cast(pNMHDR);
	// TODO: Add your control notification handler code here
	AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!"));

	*pResult = 0;
}

效果如下:

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

[cpp] view plain copy print ?
  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. }   
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{  
    // OnWndMsg does most of the work, except for DefWindowProc call  
    LRESULT lResult = 0;  
    if (!OnWndMsg(message, wParam, lParam, &lResult))  
        lResult = DefWindowProc(message, wParam, lParam);  
    return lResult;  
} 

    很显然,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消息。

[cpp] view plain copy print ?
  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.   
  6. void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)  
  7. {  
  8.     LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);  
  9.     // TODO: Add your control notification handler code here   
  10.     AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));  
  11.   
  12.     *pResult = 0;  
  13. }  
  14. </LPNMHEADER>  
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	ON_NOTIFY(HDN_BEGINTRACKA, 0, &CMyListCtrl::OnHdnBegintrack)
	ON_NOTIFY(HDN_BEGINTRACKW, 0, &CMyListCtrl::OnHdnBegintrack)
END_MESSAGE_MAP()

void CMyListCtrl::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMHEADER phdr = reinterpret_cast(pNMHDR);
	// TODO: Add your control notification handler code here
	AfxMessageBox(TEXT("CMyListCtrl处理了HDN_BEGINTRACK消息"));

	*pResult = 0;
}

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

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

 

 from:http://blog.csdn.net/wangyao1052/article/details/8057828

相关文章:

  • 海洋MP3播放器
  • 层被Flash挡住
  • Dell与Cisco 交换机之间多端口做Port-Channel注意事项
  • HTML5标签及使用方法描述
  • c#开发_Dev的关于XtraGrid的使用(GridControl小结)_First
  • 【JQuery】可直接编辑的表格
  • BE恢复单个邮箱
  • 医疗系统发展分析(转)
  • 在VMware Workstation 9上跑Win2012 HyperV
  • 对TCL/TK的一个小总结
  • httpclient完全支持ssl连接方式
  • 《高效能人士的7种心态》读后感+一年实施结果
  • 浅谈字节序(Endianness)
  • Exchange 2003队列中堆积大量垃圾邮件解决方法?
  • JavaScript面向对象编程深入分析(3)
  • CentOS7 安装JDK
  • Redash本地开发环境搭建
  • Sass 快速入门教程
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 阿里云购买磁盘后挂载
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 电商搜索引擎的架构设计和性能优化
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 深入浏览器事件循环的本质
  • 使用Swoole加速Laravel(正式环境中)
  • 我看到的前端
  • 线上 python http server profile 实践
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 白色的风信子
  • 湖北分布式智能数据采集方法有哪些?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.ajax()参数及用法
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (04)odoo视图操作
  • (AngularJS)Angular 控制器之间通信初探
  • (阿里云万网)-域名注册购买实名流程
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法设计与分析)第一章算法概述-习题
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net CF下精确的计时器
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET框架
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @Responsebody与@RequestBody
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429