win32 WM_NOTIFY 与 WM_COMMAND

Posted

技术标签:

【中文标题】win32 WM_NOTIFY 与 WM_COMMAND【英文标题】:win32 WM_NOTIFY Vs WM_COMMAND 【发布时间】:2019-04-19 18:09:56 【问题描述】:

这是一个用于控制win32 api中的消息的理论问题。

WM_COMMANDWM_NOTIFY 有什么区别? 我们什么时候需要处理这些消息,什么时候选择忽略它们?

之所以产生这种疑问是因为这两个消息都是在用户与控件交互时发送的,并且都将相同的信息发送到事件类型的窗口过程,控件 Id 和控件句柄作为结构 (WM_NOTIFY 情况下为 LPNMHDR)或直接(WM_COMMAND 情况下为 LPARAM 句柄控制和 LOWORD (WPARAM))

由于所有这些相似之处,为什么我们仍然将两者一起使用而不只是贬低一个?

【问题讨论】:

第一批UI控件(Edit、Pusbutton等)发送WM_COMMAND,将通知类型(如BN_CLICKED)和发送者(ID和句柄)打包到WPARAM和LPARAM中消息参数。当更多的控件——包括树和列表视图通用控件——被引入时,这种机制已经不够用了。引入WM_NOTIFY,以可扩展的方式允许更多参数;例如NMTVITEMCHANGEDNMLVITEM 包含不同的数据(特定于控制和通知),但都可以通过 WM_NOTIFY 安全处理。 【参考方案1】:

出于向后兼容性的原因,我们同时使用两者。新控件倾向于使用 WM_NOTIFY(它的功能要强大得多),但是现有的控件会发送 WM_COMMAND,MS 不会改变这一点。

我说 WM_NOTIFY 功能更强大,因为它的 lParam 是 NMHDR *,如果 NMHDR 是 POD 类型(或现代 C++ 术语中的标准布局)的第一个成员,那么您可以将 lParam 转换为实际类型发送的控制。 WM_COMMAND 所能提供的只是命令代码和窗口句柄。

至于何时处理它们,这完全是一个需要的问题,如果您需要处理特定控件的一部分上的特定操作,则您处理消息,否则您不处理。

【讨论】:

这是正确的。 WM_COMMAND 较旧,与非常简单的控件(如按钮和菜单条目)一起使用,以传达用户想要做“事情”的信息。 WM_NOTIFY 与 Windows 95 时代更新的通用控件一起出现。因为它可以携带更多信息(通过指向结构的指针),所以它可以表达更复杂的交互,例如单击列表视图中的列标题。您可以通过阅读特定控件的文档来了解您将获得哪种类型的控件。 所以 WM_NOTIFY 更加通用。有没有办法让任何旧样式控件发送 WM_NOTIFY 消息,可能是 CreateWindowEx() 函数中的窗口样式或控件特定的? @RVISHAL "有没有办法让任何旧式控件发送 WM_NOTIFY 消息" - 没有。 “是特定于控制的吗?” - 是的。详细阅读每个控件的文档

以上是关于win32 WM_NOTIFY 与 WM_COMMAND的主要内容,如果未能解决你的问题,请参考以下文章

WM_COMMAND 和 WM_NOTIFY 的区别

Win64与Win32的本质区别

无法理解普通 c++ 与 vc++、win32 编程、mfc、win32 api、CLI 之间的关系 [关闭]

win32与win64的操作系统的区别是啥?

与 Win32 服务的进程间通信

c语言与WIN32有啥区别?