分析与理解通知消息-WM_NOTIFY
2006-07-27 19:45
357 查看
分析与理解通知消息-WM_NOTIFY
近来,有几个网友发妹儿问了我一些关于WM_NOTIFY通知消息的使用问题,为此,我写了这篇文章,将我对WM_NOTIFY消息的理解阐述如下,希望能对各位有所帮助。
引入WM_NOTIFY消息的原因
1、问题的提出:
在Windows3.x中,不存在WM_NOTIFY消息,控制子窗口的通知消息同菜单的命令消息及加速键消息一样,均使用WM_COMMAND来发送,此时,根据WM_COMMAND消息传递的做法,可知道含有如下的传递结构:
wParam high-order : Notify Code :(如TTN_NEEDTEXT)
wParam low-order : ControlID
lParam : ControlHandle
使用上述结构进行消息的传递时,如果一个通知消息有一些附加的消息需要发送时(如传递LVN_COLUMNCLICK时可能需要附加传送如点击的是那一列等信息),因为WM_COMMAND仅能传递如上的参数,故无法做到。
2、解决的方案
--Windows 3.x中的解决方案,为这些有附加消息传送要求的通知消息,为它们各自定义了许多特殊的消息。
以WM_DRAWITEM为例:
lParam参数成为指向DRAWITEMSTRUCT结构的指针,DRAWITEMSTRUCT结构如下:
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
ULONG_PTR itemData;
} DRAWITEMSTRUCT;
这样,就实现了附加参数的传递,类似的做法在Windows3.x中随处可见。
--Windows32中的解决方案,Windows3.x的解决方案各自为政,没有统一性,为了解决这个问题,Window32中引入了一个新的消息,即WM_NOTIFY消息来解决这个问题,它将所有的这些消息采用一个统一的架构进行处理,为了与以前的处理方式兼容,上述那些特殊的消息仍然存在,它们在实质上也是相同的。
WM_NOTIFY为何能完成如此的重任?
原因:它扩展了消息的lParam参数,使它成为指向一个相对统一的结构的指针,从而使用这个结构来传递复杂的信息。
1、无需附加的信息时:
此结构为一个NMHDR结构:
NMHDR
{
HWnd hWndFrom ; //相当于原WM_COMMAND传递方式的lParam
UINT idFrom ; //相当于原WM_COMMAND传递方式的wParam(low-order)
UINT code ; //相当于原WM_COMMAND传递方式的Notify Code(wParam"s high-order)
}
2、需要附加的信息时:
此结构为一个大的结构,它的首成员必须为一个NMHDR结构的对象,它的其他成员放置此消息的附加信息。
以LVN_KEYDOWN为例:
typedef struct tagLVKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMLVKEYDOWN, FAR *LPNMLVKEYDOWN;
WM_NOTIFY消息的处理(以LVN_KEYDOWN 为例)
void C*ListCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
....
....
}
分析
1、大结构的首个成员为NMHDR,这样,使用指向NMHDR的指针来传递结构地址,不论在仅使用NMHDR结构,还是在使用大结构的情况下都适合。
2、因为此消息实际传递的即是对应的结构(NMHDR或以NMHDR作首成员的大结构)所以,如上进行强制转换,当然不会有问题。
结语
使用上述WM_NOTIFY框架处理的消息很多,它们的处理架构与一般的消息处理类似,因此,本文没有对它的具体使用进行阐述,有着方面需求的读者,请自行参阅MSDN相关内容。
另外,WM_NOTIFY消息和“消息反射”的关系十分紧密,我会尽快将我对“消息反射”的理解与分析,写出来与大家共享,再次感谢大家对本文的关注。
WM_NOTIFY消息的处理(以LVN_KEYDOWN 为例)
void C*ListCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
....
....
}
分析
1、大结构的首个成员为NMHDR,这样,使用指向NMHDR的指针来传递结构地址,不论在仅使用NMHDR结构,还是在使用大结构的情况下都适合。
2、因为此消息实际传递的即是对应的结构(NMHDR或以NMHDR作首成员的大结构)所以,如上进行强制转换,当然不会有问题。
结语
使用上述WM_NOTIFY框架处理的消息很多,它们的处理架构与一般的消息处理类似,因此,本文没有对它的具体使用进行阐述,有着方面需求的读者,请自行参阅MSDN相关内容。
另外,WM_NOTIFY消息和“消息反射”的关系十分紧密,我会尽快将我对“消息反射”的理解与分析,写出来与大家共享,再次感谢大家对本文的关注。
近来,有几个网友发妹儿问了我一些关于WM_NOTIFY通知消息的使用问题,为此,我写了这篇文章,将我对WM_NOTIFY消息的理解阐述如下,希望能对各位有所帮助。
引入WM_NOTIFY消息的原因
1、问题的提出:
在Windows3.x中,不存在WM_NOTIFY消息,控制子窗口的通知消息同菜单的命令消息及加速键消息一样,均使用WM_COMMAND来发送,此时,根据WM_COMMAND消息传递的做法,可知道含有如下的传递结构:
wParam high-order : Notify Code :(如TTN_NEEDTEXT)
wParam low-order : ControlID
lParam : ControlHandle
使用上述结构进行消息的传递时,如果一个通知消息有一些附加的消息需要发送时(如传递LVN_COLUMNCLICK时可能需要附加传送如点击的是那一列等信息),因为WM_COMMAND仅能传递如上的参数,故无法做到。
2、解决的方案
--Windows 3.x中的解决方案,为这些有附加消息传送要求的通知消息,为它们各自定义了许多特殊的消息。
以WM_DRAWITEM为例:
lParam参数成为指向DRAWITEMSTRUCT结构的指针,DRAWITEMSTRUCT结构如下:
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
ULONG_PTR itemData;
} DRAWITEMSTRUCT;
这样,就实现了附加参数的传递,类似的做法在Windows3.x中随处可见。
--Windows32中的解决方案,Windows3.x的解决方案各自为政,没有统一性,为了解决这个问题,Window32中引入了一个新的消息,即WM_NOTIFY消息来解决这个问题,它将所有的这些消息采用一个统一的架构进行处理,为了与以前的处理方式兼容,上述那些特殊的消息仍然存在,它们在实质上也是相同的。
WM_NOTIFY为何能完成如此的重任?
原因:它扩展了消息的lParam参数,使它成为指向一个相对统一的结构的指针,从而使用这个结构来传递复杂的信息。
1、无需附加的信息时:
此结构为一个NMHDR结构:
NMHDR
{
HWnd hWndFrom ; //相当于原WM_COMMAND传递方式的lParam
UINT idFrom ; //相当于原WM_COMMAND传递方式的wParam(low-order)
UINT code ; //相当于原WM_COMMAND传递方式的Notify Code(wParam"s high-order)
}
2、需要附加的信息时:
此结构为一个大的结构,它的首成员必须为一个NMHDR结构的对象,它的其他成员放置此消息的附加信息。
以LVN_KEYDOWN为例:
typedef struct tagLVKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMLVKEYDOWN, FAR *LPNMLVKEYDOWN;
WM_NOTIFY消息的处理(以LVN_KEYDOWN 为例)
void C*ListCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
....
....
}
分析
1、大结构的首个成员为NMHDR,这样,使用指向NMHDR的指针来传递结构地址,不论在仅使用NMHDR结构,还是在使用大结构的情况下都适合。
2、因为此消息实际传递的即是对应的结构(NMHDR或以NMHDR作首成员的大结构)所以,如上进行强制转换,当然不会有问题。
结语
使用上述WM_NOTIFY框架处理的消息很多,它们的处理架构与一般的消息处理类似,因此,本文没有对它的具体使用进行阐述,有着方面需求的读者,请自行参阅MSDN相关内容。
另外,WM_NOTIFY消息和“消息反射”的关系十分紧密,我会尽快将我对“消息反射”的理解与分析,写出来与大家共享,再次感谢大家对本文的关注。
WM_NOTIFY消息的处理(以LVN_KEYDOWN 为例)
void C*ListCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
....
....
}
分析
1、大结构的首个成员为NMHDR,这样,使用指向NMHDR的指针来传递结构地址,不论在仅使用NMHDR结构,还是在使用大结构的情况下都适合。
2、因为此消息实际传递的即是对应的结构(NMHDR或以NMHDR作首成员的大结构)所以,如上进行强制转换,当然不会有问题。
结语
使用上述WM_NOTIFY框架处理的消息很多,它们的处理架构与一般的消息处理类似,因此,本文没有对它的具体使用进行阐述,有着方面需求的读者,请自行参阅MSDN相关内容。
另外,WM_NOTIFY消息和“消息反射”的关系十分紧密,我会尽快将我对“消息反射”的理解与分析,写出来与大家共享,再次感谢大家对本文的关注。
相关文章推荐
- 分析与理解通知消息-WM_NOTIFY
- 分析与理解通知消息-WM_NOTIFY
- WM_NOTIFY消息流程实例分析
- WM_NOTIFY消息流程实例分析 .
- 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
- WM_NOTIFY消息流程实例分析
- 全面解读通知消息WM_NOTIFY
- 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
- WM_CHAR消息分析
- WM_PAINT消息造成CPU卡死的原因。。。。关于CDialog类和CWnd类的WM_PAINT消息的理解
- MFC下WM_NOTIFY消息处理流程
- WM_CHAR消息分析
- VCL 消息循环分析之改进版(可以触发WM_CREATE消息了)
- 消息反射机制分析与理解
- MFC下WM_NOTIFY消息处理流程
- WM_DESTROY WM_CLOSE WM_QUIT三个消息的理解
- Notify - 基于jquery的消息通知插件
- 091022(星期四)TreeCtrl的控件通知消息1 OnNotify
- WM_NOTIFY消息
- 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)