控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述,有不对的地方,还希望各路大虾批评指正。
控件通知消息
在《深度解析VC中的消息(上)》中,我们提到了消息的分类有3种:窗口消息、命令消息和控件通知消息,我们这里要谈的是最后一种:控件通知消息。
控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 她类似于命令消息,当用户与控件窗口交互时,那么控件通知消息就会从控件窗口发送到它的主窗口。但是这种消息的存在并不是为了处理用户命令,而是为了让主窗口能够改变控件,例如加载、显示数据。例如按下一个按钮,他向父窗口发送的消息也可以看作是一个控件通知消息;单击鼠标所产生的消息可以由主窗口直接处理,然后交给控件窗口处理。
控件通知消息主要由窗口类即直接或间接由CWND类派生类处理。
控件通知格式
控件通知经历了一个演变过程,因而SendMessage( )的变量Message、wParam和lParam有三种格式。
第一控件通知格式
第一控件通知格式只是窗口消息的子集。它的特征格式如下:WM_XXXX。它主要来自下面的3种消息类型:
(1)表示一个控件窗口要么已经被创建或销毁,要么已经被鼠标单击的消息:WM_PARENTNOTIFY;
(2)发送到父窗口,用来绘制自身窗口的消息,例如: WM_CTLCOLOR、WM_DRAWITEM、WM_MEASUREITEM、WM_DELETEITEM、WM_CHARTOITEM、WM_VKTOITEM、WM_COMMAND和WM_COMPAREITEM
(3)有滚动调控件发送,通知父窗口滚动窗口的消息:WM_VSCROLL和WM_HSCROLL
第二控件通知格式
第二控件通知格式与命令消息共享,它的特征格式如下:WM_COMMAND。
在WM_COMMAND中,lParam用来区分是命令消息还是控件通知消息:如果lParam为NULL,则这是个命令消息,否则lParam里面放的必然就是控件的句柄,是一个控件通知消息。对于wParam则是低位放的是控件ID,高位放的是相应的消息事件。
第三控件通知格式
这个才真正涉及到我们要讲的内容,同时他也是最为灵活的一种格式。它的特征格式如下:WM_NOTIFY。
在WM_NOTIFY中,lParam中放的是一个称为NMHDR结构的指针。在wParam中放的则是控件的ID。
NMHDR结构的由来
NMHDR结构是很值得一提的,该结构包括有关制作该通知的控件的任何内容,而不受空间和类型的限制,他的来历也是很有意思的。
在最初的windows3.x中,根本就不存在什么WM_NOTIFY,控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口。简单的通知仅发送一个WM_COMMAND消息,包含一个通知码和一个在wParam中的控件ID及一个在lPraram中的控件句柄。这样一来,wParam和lParam就都被填充了,没有额外的空间来传递一些其它的消息,例如鼠标按下的位置和时间。
为了克服这个困难,windows3.x就提出了一个比较低级的解决策略,那就是给一些消息添加一些附加消息,最为明显的就是控件自画用到的DRAWITEMSTRUCT。不知道大家对这个结构熟悉不,不过,如果你是老手,你应该非常清楚这个结构,这个结构包含了9个内容,几乎你需要控制的信息都给你提供了。为什么说它比较低级呢?因为不同的消息附加的内容不同,结果就是一盘散沙,非常混乱。
在win32中,MS又提出了一个更好的解决方案:引进NMHDR结构。这个结构的引进就是消息统一起来,利用它可以传递复杂的信息。这个结构的布局如下:
NMHDR
{
HWnd hWndFrom ; 相当于原WM_COMMAND传递方式的lParam
UINT idFrom ; 相当于原WM_COMMAND传递方式的wParam(low-order)
UINT code ; 相当于原WM_COMMAND传递方式的Notify Code(wParam"s high-order)
};
对于这个结构的应用于WM_NOTIFY信息结构,结果WM_NOTIFY就变成了:
A、无附加信息。结构变得很简单,就是一个NMHDR结构。
B、有附加信息。定义一个大的结构,它的第一个元素就是NMHDR结构,它的后面放置附加信息。
WM_NOTIFY结构的好处
除了上面我们所说的好处外,WN_NOTIFY还有自己的独特的好处:
由于在大结构中,第一个成员为NMHDR,这样一来,我们就可以利用指向NMHDR的指针来传递结构地址,根据指针的特性,无论消息有没有附加信息,这个指针都适用,也能够很方便的进行强制转换。
分析ON_NOTIFY
类向导可以创建ON_NOTIFY消息映射入口并提供一个处理函数的框架,来处理 WM_NOTIFY类型的消息。ON_NOTIFY消息映射宏有如下语法.
ON_NOTIFY(wNotifyCode,id,memberFxn)
其中:wNotifyCode:要处理的通知消息通知码。比如上面我们提到的LVN_KEYDOWN;Id:控件标识ID;MemberFxn:处理此消息的成员函数。
此成员函数有如下的原型声明:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result);
比如:假设你想成员函数OnKeydownList1处理ClistCtrl(标识ID=IDC_LIST1)的 LVN_KEYDOWN消息,你可以使用类向导添加如下的消息映射:
ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )
在上面的例子中,类向导提供如下函数:
void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKey= (LV_KEYDOWN*)pNMHDR;
*pResult = 0;
}
这时类向导提供了一个适当类型的指针,你既可以通过pNMHDR,也可以通过 pLVKey来访问这个通知结构。
ON_NOTIFY_RANGE
有时我们可能需要为一组控件处理相同的WM_NOTIFY消息。这时需要使用ON_NOTIFY_RANGE而不是ON_NOTIFY。不过,很不幸的是,VC6的ClassWizard并不支持这个消息,所以我们必须手工添加。方法和一般的手工添加的消息一样,不过需要注意的是:
(1)当你使用 ON_NOTIFY_RANGE时,你需要指定控件的ID范围.其消息映射入口及函数原型如下:
ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )
其中:wNotifyCode:消息通知码.比如:LVN_KEYDOWN。id: 第一控件的标识ID。
idLast:最后一个控件的标识ID。(标识值一定要连续)memberFxn: 消息处理函数。
(2)成员函数必须有如下原型申明:afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
相关推荐
本文主要介绍传统控件的使用方式,特别是控件通知消息的处理,以及静态控件的创建和使用。 1. **传统控件的控件通知消息** 控件通知消息是传统控件与父窗口通信的方式,用来表示特定事件的发生。例如,当用户点击...
控件通知消息由控件发送给父窗口,通知父窗口控件的状态发生了改变或用户采取了某些操作,如BN_CLIKED消息表示按钮被点击。控件消息则用于获取控件的信息和操作控件的外观和行为,比如BM_GETCHECK消息可以用来获取复...
在MFC中,实现树形控件与列表控件的交互,需要编写处理树形控件通知消息的代码。例如,当监听到TVN_SELCHANGED消息时,表示用户已经改变了选中的树节点,此时可以根据新选中的节点ID获取相应的数据,并填充到列表...
这一操作使得控件在接收到鼠标事件时,会将消息通知给其父窗口。这样,当用户点击静态控件时,系统就会将鼠标消息(如WM_LBUTTONDOWN)发送到父窗口,而不是忽略它们。 完成上述设置后,你需要在父窗口的代码中处理...
##### 组合框控件通知消息 - **CBN_CLOSEUP**: 组合框的列表框被关闭。 - **CBN_DBLCLK**: 用户双击了一个字符串。 - **CBN_DROPDOWN**: 组合框的列表框被拉出。 - **CBN_EDITCHANGE**: 用户修改了编辑框中的文本。 ...
在这个话题中,我们将深入探讨MFC中的组件消息和函数,特别是关于传统控件、控件通知消息以及静态控件的使用。 **1. 传统控件** MFC中包含了大量的Windows传统控件,如命令按钮、选择框、单选按钮、编辑框、列表框...
3. **控件通知消息**:控件通知消息是从控件发送到其父窗口的消息,通知父窗口控件的状态变化,如按钮被点击、列表框选择改变等。这些消息以WM_NOTIFY开头,携带具体的控件通知代码。 消息的处理主要依靠窗口过程...
本文将深入探讨如何实现一个类似于京东快报的上下轮播通知消息的自定义控件。这个控件能够每3秒自动滚动显示一条新的通知消息,为用户提供动态、及时的信息展示。 首先,我们需要创建一个新的Java类,继承自`View`...
3. 控件通知消息:当用户与控件交互时,控件会发送通知消息给父窗口,如BN_CLICKED通知,表示按钮已被点击。 此外,还有其他消息类型,如初始化消息、输入消息、系统消息、剪贴板消息、系统信息消息、控件处理消息...
为了响应用户在Tab控件中切换页面,我们需要添加一个控件通知消息,特别是`TCN_SELCHANGE`消息。在主对话框的编辑界面中,右键点击Tab控件并选择“添加事件处理程序”。在生成的事件处理函数中,例如`...
详情查看:http://blog.csdn.net/wangshiqilin_fjy/article/details/23166005 该资源可以直接运行里面的exe文件或者使用vs2008 vs2010 打开。 该资源讲述了MFC中鼠标位于控件上,如何弹出对应的通知或者说“消息”。
窗口消息涉及到窗口的生命周期和基本行为,命令消息响应用户的动作,而控件通知消息则允许控件与父窗口进行通信,提供高度的灵活性。 程序定义消息则允许开发者自定义消息类型,通常用于特定应用程序的内部通信。...
在MFC中,处理控件通知消息的方法有: - `ON_CONTROL(通知码, nID, fn)`:处理特定控件通知码的消息。 - `ON_CONTROL_RANGE(通知码, nFirstID, nEndID, fn)`:处理一系列控件ID的相同通知码。 - `ON_NOTIFY(通知...
3. **控件通知消息**:控件通知消息同样以`WM_COMMAND`为消息名,由编辑框、列表框等控件发送给父窗口的通知消息。这类消息包含了控件通知码,以便区分不同的控件通知。 #### 不同种类消息的映射方法 在MFC中,...
5.12.4 处理选项卡控件通知消息 236 5.12.5 CTabCtrl类简介 236 5.13 Visual C++ 2010 IP控件简介与 5.13 开发 241 5.14 Visual C++ 2010 Picture控件 5.14 简介与开发 241 5.15 Visual C++ 2010 Slider控件简介 ...
- **控件通知消息**:发生在窗口内的子控件上,需要通知父窗口的情况,例如用户对控件的交互(单击、双击、文本选择等)。 #### 消息标识符与值域 消息标识符的值域是系统严格规定的,系统保留的值范围为0x0000至...
消息控件在Web开发中是不可或缺的元素,它主要用于向用户显示实时信息,如通知、提示、警告或者反馈。在Web界面中,消息控件的设计和实现能够显著影响用户体验,因此理解和掌握消息控件的相关知识至关重要。 首先,...
消息分为三大类:窗口消息、命令消息和控件通知消息。窗口消息是最基础的,包括窗口的创建、销毁、移动等操作。命令消息通常与菜单项、快捷键或工具栏按钮相关,它们指示用户希望执行的动作。控件通知消息则来源于...