WM_NOTIFY消息流程实例分析 .
我们以CListCtrl控件为例来分析WM_NOTIFY消息。 CListCtrl控件在Report样式下会包含CHeaderCtrl标头控件,即CHeaderCtrl标头控件为CListCtrl控件的子控件,所以不难理解,拖动CHeaderCtrl标头控件的列分隔栏会投递HDN_BEGINTRACK消息(WM_NOTIFY消息,通知码为HDN_BEGINTRACK)给其父窗口CListCtrl控件。
但是,我们在对话框窗口中也可以收到CHeaderCtrl标头控件的HDN_BEGINTRACK消息,这作何解释呢?
如下所示:我们在对话框窗口中响应HDN_BEGINTRACK消息,当开始拖动标头控件时,弹出消息框提示。
LPNMHEADER phdr = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here AfxMessageBox(TEXT("CHeaderCtrl HDN_BEGINTRACK消息!")); *pResult = 0;
效果如下:
在文章MFC消息处理流程概述中可知,CListCtrl控件窗口在接收到HDN_BEGINTRACK消息时,会调用以下代码处理:
// 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消息。
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 LPNMHEADER (pNMHDR);
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
线程1和线程2均为普通Java线程,在Android中创建,然后在这两个普通Java线程中使用Handler发送和接收消息。
相关文章
- 机器学习处理流程、特征工程,模型设计实例
- 一款基于Bootstrap的js分页插件bootstrap-paginator使用实例
- C++构造函数实例——拷贝构造,赋值
- 24activiti - 流程变量(启动流程实例)
- Spring源码之构造函数实例化Bean(九)
- 《Dreamweaver CS6完美网页制作——基础、实例与技巧从入门到精通》——第2章 网页色彩知识2.1 网页配色基础
- Selenium2学习-005-WebUI自动化实战实例-003-三种浏览器(Chrome、Firefox、IE)启动脚本源代码
- java线程安全问题之静态变量、实例变量、局部变量
- Selenium实例:Python登录WebQQ
- Silverlight+WCF 新手实例 象棋 介绍四(三十一)
- 实例化需求的概念和流程
- MySQL搭建系列之多实例
- 学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project
- ORACLE 11G在相同的linuxserver从实施例1满库到实例2上
- TCP/IP 网络嗅探器开发实例