Схемы сообщений (ATL)
Карта сообщений связывает функцию обработчика с определенным сообщением, командой или уведомлением. С помощью макросов карты сообщений ATL можно указать карту сообщений для окна. Процедуры окна в CWindowImpl
, CDialogImpl
а CContainedWindowT
также перенаправление сообщений окна на карту сообщений.
Функции обработчика сообщений принимают дополнительный аргумент типаBOOL&
. Этот аргумент указывает, был ли обработано сообщение и по умолчанию задано значение TRUE. Затем функция обработчика может задать аргумент false, чтобы указать, что он не обрабатывал сообщение. В этом случае ATL будет продолжать искать функцию обработчика далее в карте сообщений. Задав этот аргумент значение FALSE, сначала можно выполнить некоторые действия в ответ на сообщение, а затем разрешить обработку по умолчанию или другую функцию обработчика завершить обработку сообщения.
Карты сообщений в цепочке
ATL также позволяет привязывать карты сообщений, которые направляют обработку сообщений на карту сообщений, определенную в другом классе. Например, можно реализовать общую обработку сообщений в отдельном классе, чтобы обеспечить единообразное поведение для всех цепочки окон к данному классу. Можно создать цепочку к базовому классу или к члену данных класса.
ATL также поддерживает динамическую цепочку, которая позволяет связываться с картой сообщений другого объекта во время выполнения. Чтобы реализовать динамическую цепочку, необходимо наследовать класс из CDynamicChain. Затем объявите макрос CHAIN_MSG_MAP_DYNAMIC в карте сообщений. CHAIN_MSG_MAP_DYNAMIC требуется уникальное число, определяющее объект и карту сообщений, к которой выполняется цепочка. Это уникальное значение необходимо определить с помощью вызова CDynamicChain::SetChainEntry
.
Вы можете привязывать к любому классу, объявляющем карту сообщений, если класс является производным от CMessageMap. CMessageMap
позволяет объекту предоставлять карты сообщений другим объектам. Обратите внимание, что CWindowImpl
уже является производным от CMessageMap
.
Альтернативные карты сообщений
Наконец, ATL поддерживает альтернативные карты сообщений, объявленные с помощью макроса ALT_MSG_MAP . Каждая альтернативная карта сообщений определяется уникальным номером, который передается в ALT_MSG_MAP. С помощью альтернативных карт сообщений можно обрабатывать сообщения нескольких окон на одной карте. Обратите внимание, CWindowImpl
что по умолчанию не используется альтернативные карты сообщений. Чтобы добавить эту поддержку, переопределите WindowProc
метод в CWindowImpl
производном классе и вызовите ProcessWindowMessage
идентификатор карты сообщений.