MFC 中NMHDR简要

首先:NMHDR = Notify Message Handler

NMHDR 结构包含下列成员:

typedefstructtagNMHDR{
    HWNDhwndFrom;//handle of control sendingmessage,相当于原WM_COMMAND传递方式的lParam
    UINTidFrom;//identifier of control sendingmessage相当于原WM_COMMAND传递方式的wParam(low-order
    UINTcode;//notification code;see below相当于原WM_COMMAND传递方式NotifyCode(wParam"shigh-order)
}NMHDR;

ON_NOTIFY( wNotifyCode, idControl, memberFxn )消息通过下面的宏定义之:

wNotifyCode//通知消息标识符代码,如 TBN_BEGINADJUST。

idControl//发送通知的控件的标识符。

memberFxn//接收到通知时调用的成员函数。

成员函数将用下列原型声明:

afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );

在WM_NOTIFY中,lParam中放的是一个称为NMHDR结构的指针。在wParam中放的则是控件的ID。

NMHDR结构是很值得一提的,该结构包括有关制作该通知的控件的任何内容,而不受空间和类型的限制,他的来历也是很有意思的。

在最初的windows3.x中,根本就不存在什么WM_NOTIFY,控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口。简单的通知仅发送一个WM_COMMAND消息,包含一个通知码和一个在wParam中的控件ID及一个在lPraram中的控件句柄。这样一来,wParam和lParam就都被充了,没有额外的空间来传递一些其它的消息,例如鼠标按下的位置和时间。

为了克服这个困难,windows3.x就提出了一个比较低级的解决策略,那就是给一些消息添加一些附加消息,最为明显的就是控件自画用到的DRAWITEMSTRUCT。不知道大家对这个结构熟悉不,不过,如果你是老手,你应该非常清楚这个结构,这个结构包含了9个内容,几乎你需要控制的信息都给你提供了。为什么说它比较低级呢?因为不同的消息附加的内容不同,结果就是一盘散沙,非常混乱。

在win32中,MS又提出了一个更好的解决方案:引进NMHDR结构。这个结构的引进就是消息统一起来,利用它可以传递复杂的信息。这个结构的布局如开头。

A、无附加信息。结构变得很简单,就是一个NMHDR结构。对于这个结构的应用于WM_NOTIFY信息结构,结果WM_NOTIFY就变成了:

B、有附加信息。定义一个大的结构,它的第一个元素就是NMHDR结构,它的后面放置附加信息。

举例://得到选中的列

voidCMyView::OnColumnclick(NMHDR*pNMHDR,LRESULT*pResult)
{
    NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
    column=pNMListView->iSubItem;//得到选中的列
}

以上内容来自百度百科,稍后整理自己的实际体会。

时间: 2024-11-06 00:05:03

MFC 中NMHDR简要的相关文章

MFC中的NMHDR结构体

建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; } 问题1:参数NMHDR* pNMHDR, LRESULT* pResul

MFC中快速应用OpenCV(转)

转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘起 本教程原始讨论主题,请见 [原创]MFC中快速应用OpenCV教程,制作此教程的目的,就是为了方便广大windows下面使用MFC的用户可以轻松的在MFC窗口View类中,实现OpenCV格式图片的显示. 介绍基本的openCV和MFC的操作 在MFC中如何应用菜单,和Canny算子的实例 创建

MFC 中 Tooltip 实现的几种方式

方法一:利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下:1.在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)SetTipText是个回调函数,名字叫什么无所谓,符合原型就行了,原型下面会说.    2.EnableToolTips(TRUE),使用这个方法调用这个函数是必不可少的.建议在CDialog::OnInitDialog调用. 3.在窗口中增加一个函数用于动态提供显示内容,

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示: 只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢? 下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本: 当响应鼠标左键的消息时,第一个版本: 获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转

MFC中的DC CDC HDC由来由去理解

MFC中的DC CDC HDC由来由去理解 在此非常感谢博客主的究竟钻研,非常详细的参考资料:http://blog.csdn.net/yam_killer/article/details/7661449

MFC中添加ToolTip提示框

PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型成员,并在适当的地方将其初始化如下: m_ToolTipCtrl.Create(this); m_ToolTipCtrl.AddTool(GetDlgItem(IDC_BUTTON1), _T("This is ToolTip")); m_ToolTipCtrl.SetMaxTipWidt

MFC中消息响应机制

由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的宏. (1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明. (2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()和 END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

MFC中添加新的对话框

MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Class,然后弹出的对话框中对新增的类进行设置,在Base Class需要选择CDialog,然后输入新增类的名称之后,就新增了一个类.这个类不仅有对应的头文件还有.cpp文件,以及一个与这个类对应的UI界面. 然后,需要将新增的类对应的头文件包含到它对应的父类的头文件中,同时在protected域中声