2015-05-12 3 views
1

У меня есть класс WidgetController, который управляет несколькими виджетами (двигатели, как выясняется, но это может быть практически все). У него есть сопутствующий пользовательский интерфейс WidgetControllerUI, чтобы делать элементы интерфейса, представляющие несколько виджетов.Работа с несколькими сообщениями WM_USER (или достижение того же результата)

Я хотел бы, чтобы отправлять сообщения, такие как 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 вообще?

+1

Я бы просто использовал одно сообщение и передал N в wparam или lparam, но я не знаю, облегчит ли это MFC. –

+1

Я бы даже не потрудился с «N», просто передал экземпляр виджета в wParam или lParam. –

+0

Ха! Все эти годы, используя PostMessage() с аргументами по умолчанию ... Я никогда не замечал, что вы можете отправлять с ним дополнительные параметры! D'Oh! Очевидный ответ - спасибо! – omatai

ответ

1

Да, как предположил @Ross, вы можете передать «N» в PostMessage() как один из аргументов [lParam, wParam]. Они представляют собой размер указателя как на 32, так и на 64-битной ОС.

Обратите внимание, что ваши махинации с N часто не нужны. С динамически выделенными объектами (например, как элементы GUI, так как они должны пережить функцию, которая их создала), в качестве одного из параметров обычно передается указатель экземпляра объекта. Другой может использоваться (например, как перечислитель) для управления функцией обработчика сообщений (например, с помощью переключателя/случая) для выполнения определенного действия с переданным экземпляром.

Вам понадобится немного кастинга в любом случае, но у меня никогда не было проблем с такими механизмами.

Единственная возможная проблема заключается в том, что экземпляр не может существовать к моменту получения сообщения, например. потому что пользователь удалил его путем «нормального» взаимодействия с пользователем с графическим интерфейсом. Насколько это возможно, и как вы можете защититься от него, зависит от приложения.