我有一个WidgetController
类来控制多个小部件(事实证明是电机,但它几乎可以是任何东西)。它有一个伴随UI类WidgetControllerUI
来执行代表多个小部件的UI事物。
我想将WM_USER + 1000 + N
实例中的WidgetController
等消息发送到WidgetControllerUI
实例,以指示小部件N
发生了某些事情。这部分很简单:
// Somewhere inside WidgetController:
pWidgetUI->PostMessage( WM_USER + 1000 + N );
但是如何将所有这些(连续的)消息引导到我的WidgetControllerUI
类中的单个消息处理程序中?从表面上看,ON_COMMAND_RANGE
,ON_UPDATE_COMMAND_UI_RANGE
和ON_CONTROL_RANGE
似乎不合适。是吗?是否有更优雅的机制,可能根本不使用Windows消息?
答案 0 :(得分:1)
是的,正如@Ross建议的那样,你可以将'N'作为[lParam,wParam]参数之一传递给PostMessage()。它们在32位和64位操作系统上都是指针大小。
请注意,带有N的恶作剧通常是不必要的。对于动态分配的对象(如GUI元素通常因为它们必须比创建它们的函数更长),通常将对象实例指针作为参数之一传递。可以使用另一个(例如,作为枚举)来命令消息处理函数(例如,使用开关/案例),以在传递实例的情况下执行某些特定操作。
无论哪种方式,您都需要进行一些投射,但我对此类机制一直没有任何问题。
唯一可能的问题是,在收到消息时,实例可能不存在,例如。因为用户通过与GUI的“正常”人工交互删除了它。这种可能性以及如何防范它是特定于应用程序的。