谈谈MFC中的消息映射(4)
控件通知消息相对而言就复杂一点了.限于篇幅不能一一涉及.这里我们仅讨论 WM_NOTIFY消息的处理.
WM_NOTFY产生的原因如下。
在WINDOWS3.X中控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口.简单的通知仅发送一个WM_COMMAND消息.包含一个通知码(比如BN_CLICKED)和一个在wParam中的控件ID及一个在lPraram中的控件句柄.因为wParam 和lParam均被使用.就没有方法传送其它的附加信息了.比如在BN_CLICKED 通知消息中.就没有办法发送关于当鼠标点击时光标的位置信息.在这种情况下就只能使用一些特殊的消息.包括:WM_CTLCOLOR,WM_VSCROLL, WM_HSCROLL等等.值得一提的是这些消息能被反射回发送它们的控件.就是所谓的消息反射.有兴趣的读者请参阅有关专著.
在WIN32中同样可以使用那些在WINDOWS3.1中使用的通知消息.不过不像过去通过增加特殊目的的消息来为新的通知发送附加的数据.而是使用一个叫 WM_NOTIFY的消息,它能以一个标准的风格传送大量的附加数据.
WM_NOTIFY消息包含一个存在wParam中的发送消息控件的ID和一个存在 lParam中的指向一个结构体的指针.这个结构可能是NMHDR结构体.也可能是第一个成员是NMHDR的更大的结构.因为NMHDR是第一个成员,所以指向这个结构的指针也可以指向NMHDR.
在许多情况下,这个指针将指向一个更大的结构,当你使用时必需转换它.只有很少的通知消息.比如通用通知消息(它的名字以NM_打头),工具提示控件的 TTN_SHOW和TTN_POP实际上在使用NMHDR结构.
NMHDR结构包含了发送消息控件的句柄,ID及通知码(如TTN_SHOW),其格式如下:
Typedef sturct tagNMHDR{
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
对TTN_SHOW消息而言,code成员的值将设为TTN_SHOW.
类向导可以创建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);