Макросы записей карты сообщений. Удаление записей карты сообщений

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

   
В MFC определены 4 типа макросов записей карты сообщений (они перечислены в таблице 1), каждый из
которых соответствует определенному типу сообщений.

Таблица 1. Макросы записей карты сообщений

Тип сообщенияМакросПараметры
Стандартное сообщение WindowsON_WM_XXX (где XXX - название сообщения)Нет
Командное сообщениеON_COMMANDИдентификатор команды, название функции-обработчика
Команда обновленияON_UPDATE_COMMAND_UIИдентификатор команды, название функции-обработчика
Уведомление от элементов управленияON_XXX (где XXX - название уведомления)Идентификатор команды, название функции-обработчика

   
Наверняка Вы заметили, что сгенерированный мастером ClassWizard код помещен внутри блока, который начинается с комментария
//{{AFX_MSG и заканчивается //}}AFX_MSG. Эти надписи обозначают область, изменяемую мастером ClassWizard.
Вы вправе добавлять записи карты сообщений вручную, но только снаружи блока, ограниченного этими комментариями. В противном случае
ClassWizard начнет работать неправильно. Модификатор AFX_MSG, предшествующий объявлению функций-обработчиков,
тоже используется мастером ClassWizard. Он никак не влияет на компиляцию.
Удаление записей карты сообщений

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

  • Удаление функции CMyAppApp::OnEditPaste().
  • Откройте проект СМуАрр, нажмите клавиши CTRL+W, таким образом открыв мастер ClassWizard. Перейдите на вкладку
    Message Maps.
  • В списке Class Name выберите СМуАррАрр.
  • В списке Member functions щелкните элемент OnEditPaste.
    Рис.1. Выбор удаляемой функции
  • Щелкните кнопку Delete Function. Появится окно с сообщением, что удалить реализацию функции Вы должны сами.
    Щелкните кнопку Да.
  • Закройте ClassWizard, щелкнув кнопку ОК.
  • Найдите функцию в файле МуАрр.срр и удалите ее.
  • Соберите и запустите приложение. Чтобы убедиться в правильном удалении функции, проверьте работу меню Edit.

Текст измененного на этом шаге приложения можно взять здесь (40,2 Кб).
Маршрутизация команд

   
Вернемся к способам передачи командных сообщений объектам приложения. Сообщение обрабатывается в наиболее подходящем для этого классе благодаря
маршрутизации команд. Каркас MFC-приложения передает команду по стандартной цепочке объектов (определенной для тех классов,
которые являются производными от CCmdTarget и имеют карту сообщений) в поисках объекта, в котором есть обработчик этой команды. Каждый
объект в цепочке ищет в своей карте сообщений функцию, способную обработать поступившее сообщение.

   
Такая маршрутизация команд бывает очень полезна. Например, "быстрая" клавиша посылает сообщение ID_SAVE_WINDOW STATE. Ее нажатие показывает,
что пользователь хочет сохранить текущие параметры окна. В некоторых оконных объектах иногда присутствует функция-обработчик этого сообщения
OnSaveWindowState(), а в других, например во временных диалоговых окнах и окнах справки, она может отсутствовать. При маршрутизации данной
команды сначала проверяется карта сообщений активного окна. Если в ней нет функции OnSaveWindowState(), начнется проверка родительского окна.
Если же и в нем нет такого обработчика, то выполняется переход к карте сообщений объекта приложения.

   
Маршрут изменяется в зависимости от контекста. Вы найдете дополнительную информацию по данному вопросу, осуществив поиск по словам "command routing" в справочной системе Visual C++.

   
Подводя итог сказанному отметим, что каркас MFC-приложения - это небольшая группа взаимосвязанных классов, которые вместе с несколькими
глобальными функциями составляют основу любого Windows-приложения. Средствами мастера AppWizard легко создать набор классов,
производных от классов каркаса, и собрать на базе него любую нужную Вам программу.

   
В каркас приложений входит класс CWinApp, инкапсулирующий приложение в целом. В нем определены несколько функций, вызываемых процедурой
WinMain() при инициализации, работе и завершении приложения. Класс CFrameWnd инкапсулирует окно-рамку, которое может выполнять роль
главного окна приложения, а также содержать меню, панели инструментов и клиентскую область.

   
В MFC-приложениях сообщения обрабатываются функциями-членами классов приложения. Сообщения связываются со своими обработчиками посредством
карты сообщений, которая поддерживается всеми классами, производными от CCmdTarget. Карта сообщений - это таблица,
определенная в объявлении класса. Она сопоставляет идентификаторы сообщений и функции этого класса. Для добавления и удаления записей карты сообщений используйте мастер ClassWizard.

   
Командные сообщения передаются объектам приложения в определенной последовательности до тех пор, пока не находится объект, пособный их обработать.
Такая маршрутизация команд позволяет приложению обрабатывать сообщения в наиболее подходящем для этого классе.

   
Со следующего шага мы начнем знакомиться с архитектурой "документ/вид".



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий