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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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

时间: 2025-01-24 14:58:41

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

Android编程之消息机制实例分析_Android

本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

Android编程之消息机制实例分析

本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

PHP消息队列用法实例分析_php技巧

本文实例讲述了PHP消息队列用法.分享给大家供大家参考,具体如下: 该消息队列用于linux下,进程通信 #根据路径和后缀创建一个id $key = ftok(__DIR__, 'R'); #获取队列中的消息 $q = msg_get_queue($key); #删除队列 msg_remove_queue($q); #获取队列的状态信息 $status = msg_stat_queue($q); print_r($status); echo "\n"; for($i=0;$i<1

Go语言中关闭带缓冲区的频道实例分析_Golang

本文实例分析了Go语言中关闭带缓冲区的频道.分享给大家供大家参考.具体分析如下: Go语言提供了两种频道,带缓冲区和不带缓冲区的.不带缓冲区的频道,发送和接收是同步的,必须接收端接收了消息,发送端才能从发送调用中解脱.带缓冲区的频道,在缓冲区满之前,发送和接收是异步的,发送端的发送操作只保证把消息放入缓冲区. Go的频道是可以关闭的,关闭频道的目的是让接收端知道不会再有消息从这个频道进入,我们可能会用某个频道的关闭来表示某种状态的终结. 当我们关闭一个带缓冲区的频道时,如果缓冲区中还有消息,接收

CodeIgniter控制器之业务逻辑实例分析_php实例

本文实例分析了CodeIgniter控制器之业务逻辑.分享给大家供大家参考,具体如下: 前面分析了公用控制器按模块分发,方便对特定模块的控制,而具体的实现类则是放在library中.那放在library中是否合适呢?以及控制器中更多的业务逻辑该放在哪里? 先说下对CI中几个文件夹的理解 helpers.libraries: 存放一系列辅助函数.辅助类,用来辅助控制器.业务逻辑实现功能.他们中的方法应当尽量避免与CI依赖,依赖越紧越难以复用.以邮件发送为例,发送邮件时很多参数是不变的,如编码.协议

Android 图片的三级缓存机制实例分析

Android 图片的三级缓存机制实例分析 当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展.为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进行: (1)从缓存中获取图片 (2)从本地的缓存目录中获取图片,并且获取到之后,放到缓存中 (3)从网络去下载图片,下载完成之后,保存到本地和放到缓存中 很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验. 快速实现三级缓存的工具类ImageCac

Python二分法搜索算法实例分析

  这篇文章主要介绍了Python二分法搜索算法,实例分析了Python实现二分法的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 今天看书时,书上提到二分法虽然道理简单,大家一听就明白但是真正能一次性写出别出错的实现还是比较难的,即使给了你充足的时间,比如1小时.如果你不是特别认真的话,可能还是会出一些这样那样的错误,所以就尝试了自己去实现一下,看能否一次通过,结果自然不言而喻,虽然用的时间不长,但是我失败了,呵呵. 个人觉得失败的最主要原因是自己没有认真的先想好这个思路和可能出现的分支

PHP memcache实现消息队列实例

现在memcache在服务器缓存应用比较广泛,下面我来介绍memcache实现消息队列等待的一个例子,有需要了解的朋友可参考. memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志.然后通过定时程序将内容落地到文件或者数据库. php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问题,那么可以采取队列. 方便实现队列的轻量级队列服务器是: starling支持memcache协议的轻量级持久化服务器 https://github.co

巧用百度分词技术实例分析博客多个关键词的排名

武汉SEO混小子最近每天忙着做饭啊做饭.被做饭折腾的够呛,手上还有很多网站需要维护,所以博客一直不接单子做,找的人倒是挺多的,昨天就有一位广州的人加我QQ,咨询了下网站的事情,他也是位初入SEO的朋友,老板交给他一个网站,要在首页做8个关键词,因为每个关键词有的长有的短,结合起整体,就感觉非常长,或许效果不是很好,就来问到我,其实这样的问题我在以前也纠结过,不过还好,慢慢的使用实例就解决掉了,合理的运用百度分词技术可以达到这个目的,今天这篇文章就实例分析下我的这个博客,让新手朋友直观的了解下百度