Производные схемы сообщений
Во время обработки сообщений проверка сопоставление сообщений класса не является концом истории карты сообщений. Что происходит, если класс CMyView
(производный от CView
) не имеет соответствующей записи для сообщения?
Имейте в виду, что CView
базовый класс CMyView
, производный в свою очередь от CWnd
. Таким образомCMyView
, это и есть CWnd
CView
. Каждый из этих классов имеет собственную карту сообщений. На рисунке ниже показана иерархическая связь классов, но помните, что CMyView
объект является одним объектом, который имеет характеристики всех трех классов.
Иерархия представлений
Если сообщение не удается сопоставить с картой сообщений класса CMyView
, платформа также ищет карту сообщений своего немедленного базового класса. Макрос BEGIN_MESSAGE_MAP
в начале карты сообщений указывает два имена классов в качестве аргументов:
BEGIN_MESSAGE_MAP(CMyView, CView)
Первый аргумент называет класс, к которому принадлежит карта сообщений. Второй аргумент предоставляет соединение с непосредственным базовым классом, в данном случае CView
, чтобы платформа также могли искать карту сообщений.
Обработчики сообщений, предоставляемые в базовом классе, таким образом наследуются производным классом. Это очень похоже на обычные функции виртуальных членов без необходимости сделать все функции-члены обработчика виртуальными.
Если обработчик не найден в любой из карт сообщений базового класса, обработка сообщения по умолчанию выполняется. Если сообщение является командой, платформа направляет ее в следующий целевой объект команды. Если это стандартное сообщение Windows, сообщение передается в соответствующую процедуру окна по умолчанию.
Чтобы ускорить сопоставление сообщений, платформа кэширует последние совпадения по вероятности того, что она снова получит то же сообщение. Одним из последствий этого является то, что платформа обрабатывает необработанные сообщения довольно эффективно. Карты сообщений также более эффективны, чем реализации, использующие виртуальные функции.