和前面提到的传统控件在某些方面存在不同。Win32 控
件采用新的WM_NOTIFY 消息来实现新控件的消息通知机制。在该消息的wParam 中含有控
件的ID,lParam 中则有一个指针,这个指针指向一个结构。这个结构要么是NMHDR 结构,
要么是一个以NMHDR 结构作为第一个成员的扩充结构。通过NMHDR 结构及其扩充结构可
以传递附加数据。从理论上讲,可以通过扩充结构传送任意多的数据。需要指出的是,由于
NMHDR 结构是扩充结构的第一个成员,因此lParam 中的指针即可以认为是指向NMHDR
结构的,也可以认为是指向包含NMHDR 结构的扩充结构的。
1.NMHDR 结构
NMHDR 结构如下:
typedef struct tagNMHDR
{
HWND hwndFrom; //控件窗口的句柄
UINT idFrom; //控件的ID
UINT code; //控件的通知消息码
}NMHDR;
一个典型的扩充结构如下,该结构用于列表视图控件的LVN_KEYDOWN 通知消息。
typedef struct tagLV_KEYDOWN{
NMHDR hdr; //NMHDR 结构作为第一个成员
枫叶文学网www.fywxw.com
第5 章 常用控件
·129·
WORD wVKey;
UINT flags;
}LV_KEYDOWN;
2.WM_NOTIFY 消息处理
WM_NOTIFY 的消息映shè由宏ON_NOTIFY 负责,该消息映shè宏具有如下形式:
ON_NOTIFY(wNotifyCode,idcommberFxn)
参数wNotifyCode 说明了通知消息码,参数id 是控件的ID,第三个参数则是消息处理
函数名。消息处理函数应该按下面的形式声明,其中参数pNotifyStruct 指向NMHDR 及其扩
充结构,参数result 指向一个处理结果:
afx_msg voidcommberFxn(NMHDR* pNotifyStruct, LRESULT * result);
利用ClassWizard 可以很方便地加入WM_NOTIFY 消息映shè及其处理函数,一个典型的
WM_NOTIFY 消息映shè如下,其中LVN_KEYDOWN 是IDC_LIST1 列表视图控件发出的通
知消息:
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1,OnKeydownList1)
消息处理函数OnKeydownList1 的定义如下:
void CMyDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// cod