2011-12-14 2 views
1

Я пытаюсь понять, как работает маршрутизация сообщений в MFC, и у меня есть некоторые вопросы относительно этого. Представьте себе элемент управления, который расширяет CWnd. Мой первый вопрос: все ли сообщения в этом элементе управления передаются родительскому элементу управления?Понимание CStatic и CWnd и маршрутизации сообщений

Я знаю, что это не происходит с CStatic, который передает только определенные сообщения, когда вы устанавливаете стиль SS_NOTIFY. Что я пытаюсь понять, если это специфично для CStatic или происходит со всеми элементами управления. В частности, я пытаюсь создать элемент управления, который имеет несколько дочерних элементов управления с единственной целью определения их макета. Я хотел, чтобы все сообщения дочерних элементов управления обрабатывались родителем этого промежуточного элемента управления. Например, если этот элемент управления макета имеет дочернюю кнопку, при нажатии кнопки сообщение будет отправлено родительскому объекту, который будет обрабатываться.

Однако я не намерен обрабатывать все сообщения вручную. Итак, если я передам свой контроль из CWnd вместо CStatic, будет ли передано сообщение? Доступны ли FORWARD_NOTIFICATIONS() в MFC? Если нет, я предпочел бы расширить свои промежуточные классы для обработки сообщений по мере необходимости. Любые другие решения, которые вы знаете?

ответ

0

Необходимо использовать оповещения, что означает отправку сообщения WM_NOTIFY со своим кодом, указанным в прилагаемой структуре. Затем ваши родительские элементы управления могут обрабатывать сообщения с помощью ON_NOTIFY, или вы можете получить класс владельца для обработки самого сообщения с помощью ON_NOTIFY_REFLECT.

Вы всегда можете избежать архитектуры обмена сообщениями Windows \ MFC и вместо этого использовать систему на основе событий. Что-то вроде Boost.Signals2. В наших приложениях мы используем смесь сообщений WM_NOTIFY и Boost.Signals2.

1

Сообщения отправляются в самое окно.

Некоторые окна отправляют сообщения своим родителям, обычно в виде сообщений WM_NOTIFY или (например, для кнопок) в специальном сообщении типа BN_CLICKED.

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

Это примерно то, как оно работает абстрактно. То, что вы хотите (иметь родительский контроль, обрабатывать все сообщения, отправляемые всем дочерним элементам), обычно не так, как вы должны это делать. Например, вы не хотите, чтобы все WM_PAINT для дочерних окон отправлялись родителям.

То, что вы хотите сделать (нажатие кнопки управления), отличается. Нажатие кнопки «вызывается» кнопкой в ​​виде BN_CLICKED. В любом случае, это будет обрабатываться родителем.

Если вы все еще решите, вы можете взять WndProc дочерних окон, чтобы выполнить некоторую «фильтрацию». Как правило, это делается с использованием виртуальной функции PreTranslateMessage().

+0

То, что я хотел, было для сообщений, которые будут обрабатываться родителем, которые будут обрабатываться дедушкой и бабушкой. Сообщения, которые должны были обрабатываться элементом управления, будут сохранены. Я хотел, чтобы мой контейнер был прозрачным для сообщений, отправленных родительскому объекту. – webdreamer

+0

ОК, я понимаю. Это невозможно сделать «легко», где «легко» означает использование только макроса или так. Вам придется ловить сообщения в родительском (контейнере) и вручную пересылать их родительскому контейнеру. Большая часть этого может быть автоматизирована, хотя, например, перехватывая все сообщения BN_CLICKED одной функции, и эта функция пересылает их родителям. Таким образом, вам не придется обновлять контейнер каждый раз, когда вы добавляете кнопку. – Roel

+0

Могу ли я обработать сообщение BN_CLICKED и отправить сообщение родительскому? Как?Или мне нужно отправить общий Notifty и рассказать сообщения в родительском? – webdreamer

Смежные вопросы