Урок №3 - Исследование структуры приложения MFC
Таблица сообщений
В файлах HW.h и HW.cpp мы встретились с макросами DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Что представляют собой эти макросы и как они связываются с основным циклом сообщений приложения в функции Run объекта приложения?
Функция Run отправляет сообщения их окнам назначения, как и любое приложение делает это в своем основном цикле. В действительности он вызывает для этой цели ту же функцию, ::DispatchMessage. Таким образом, первым получателем сообщения всегда является окно.
Функция обработки сообщений в объекте, способном получать сообщения обычно передает или маршрутизирует сообщения в следующем порядке:
-
Любому текущему активному дочернему целевому объекту;
-
Самому себе;
-
Другим командным объектам.
Например, командное сообщение, которое в конце концов обрабатывается классом документа приложения, может пройти путь через его окно-рамку и окно просмотра перед тем, как его действительно достигнет обработчик сообщения в классе документа.
Итак, макрос DECLARE_MESSAGE_MAP объявляет массив входов таблицы сообщений частью объявления класса. Макросы BEGIN_MESSAGE_MAP и END_MESSAGE_MAP заключают между собой последовательность инициализаций этого массива, представляющие собой отдельные сообщения, на которые должен отвечать класс.
Посмотрите на входы таблицы сообщений в HW.cpp. Эти входы по умолчанию связывают несколько стандартных команд из меню File с их реализацией по умолчанию, являющейся частью класса CWinApp. Макрос ON_COMMAND - один из нескольких, упрощающих создание входа таблицы сообщений. Обычно эти входы создаются мастером классов ClassWizard автоматически; однако иногда необходимо добавить их вручную (например, при обработке специальных сообщений приложения).