处理多个 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_RANGEON_UPDATE_COMMAND_UI_RANGEON_CONTROL_RANGE 看起来并不同花。他们是吗?有没有更优雅的机制,也许根本不使用 Windows 消息?

是的,正如@Ross 建议的那样,您可以将 'N' 作为 [lParam, wParam] 参数之一传递到 PostMessage() 中。它们在 32 位和 64 位上都是指针大小 OS.

请注意,您对 N 的恶作剧通常是不必要的。对于动态分配的对象(通常与 GUI 元素一样,因为它们必须比创建它们的函数活得更久),将对象实例指针作为参数之一传递是很常见的。另一个可以用于(例如作为枚举)来命令消息处理函数(例如使用 switch/case),以对传递的实例执行某些特定操作。

无论哪种方式,您都需要进行一些转换,但我从未遇到过此类机制的任何问题。

唯一可能的问题是在收到消息时实例可能不存在,例如。因为用户已通过 'normal' 与 GUI 的人工交互将其删除。这种可能性有多大,以及您如何防范它,是特定于应用程序的。