处理多个 WM_USER 消息(或实现相同的结果)
Handling multiple WM_USER messages (or achieving the same result)
我有一个 WidgetController
class 可以控制多个小部件(事实证明是电机,但它实际上可以是任何东西)。它有一个同伴 UI class WidgetControllerUI
来做 UI 代表多个小部件的事情。
我想从 WidgetController
实例向 [=13=] 实例发送诸如 WM_USER + 1000 + N
的消息,以指示小部件 N
发生了某些事情。那部分很简单:
// Somewhere inside WidgetController:
pWidgetUI->PostMessage( WM_USER + 1000 + N );
但是如何将所有这些(连续的)消息定向到我的 WidgetControllerUI
class 中的单个消息处理程序中?从表面上看,ON_COMMAND_RANGE
、ON_UPDATE_COMMAND_UI_RANGE
和 ON_CONTROL_RANGE
看起来并不同花。他们是吗?有没有更优雅的机制,也许根本不使用 Windows 消息?
是的,正如@Ross 建议的那样,您可以将 'N' 作为 [lParam, wParam] 参数之一传递到 PostMessage() 中。它们在 32 位和 64 位上都是指针大小 OS.
请注意,您对 N 的恶作剧通常是不必要的。对于动态分配的对象(通常与 GUI 元素一样,因为它们必须比创建它们的函数活得更久),将对象实例指针作为参数之一传递是很常见的。另一个可以用于(例如作为枚举)来命令消息处理函数(例如使用 switch/case),以对传递的实例执行某些特定操作。
无论哪种方式,您都需要进行一些转换,但我从未遇到过此类机制的任何问题。
唯一可能的问题是在收到消息时实例可能不存在,例如。因为用户已通过 'normal' 与 GUI 的人工交互将其删除。这种可能性有多大,以及您如何防范它,是特定于应用程序的。
我有一个 WidgetController
class 可以控制多个小部件(事实证明是电机,但它实际上可以是任何东西)。它有一个同伴 UI class WidgetControllerUI
来做 UI 代表多个小部件的事情。
我想从 WidgetController
实例向 [=13=] 实例发送诸如 WM_USER + 1000 + N
的消息,以指示小部件 N
发生了某些事情。那部分很简单:
// Somewhere inside WidgetController:
pWidgetUI->PostMessage( WM_USER + 1000 + N );
但是如何将所有这些(连续的)消息定向到我的 WidgetControllerUI
class 中的单个消息处理程序中?从表面上看,ON_COMMAND_RANGE
、ON_UPDATE_COMMAND_UI_RANGE
和 ON_CONTROL_RANGE
看起来并不同花。他们是吗?有没有更优雅的机制,也许根本不使用 Windows 消息?
是的,正如@Ross 建议的那样,您可以将 'N' 作为 [lParam, wParam] 参数之一传递到 PostMessage() 中。它们在 32 位和 64 位上都是指针大小 OS.
请注意,您对 N 的恶作剧通常是不必要的。对于动态分配的对象(通常与 GUI 元素一样,因为它们必须比创建它们的函数活得更久),将对象实例指针作为参数之一传递是很常见的。另一个可以用于(例如作为枚举)来命令消息处理函数(例如使用 switch/case),以对传递的实例执行某些特定操作。
无论哪种方式,您都需要进行一些转换,但我从未遇到过此类机制的任何问题。
唯一可能的问题是在收到消息时实例可能不存在,例如。因为用户已通过 'normal' 与 GUI 的人工交互将其删除。这种可能性有多大,以及您如何防范它,是特定于应用程序的。