Макросы-компоненты карты сообщений 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Макросы-компоненты карты сообщений

Поиск

Сообщения в MFC

 

Все сообщения в MFC разделены на следующие три категории:

 

· Сообщения Windows, имена которых начинаются с WM_, за исключением WM_COMMAND. Сообщения этой категории предназначены для обработки в оконных процедурах.

· Извещения (WM_COMMAND, WM_NOTIFY и др.) для родительских окон от дочерних окон, в частности, от элементов управления (кнопок, списков, строковых редакторов и т.д.). Исключение: извещение BN_CLICKED, посылаемое элементом управления BUTTON при нажатии клавиши, которые трактуется как командное сообщение.

· Командные сообщения WM_COMMAND от объектов интерфейса пользователя: меню, кнопок панелей инструментов и клавиш-акселераторов. Могут обрабатываться не только окнами, но и другими потомками CCmdTarget, например, приложениями.

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

Библиотека MFC берет на себя обработку большинства сообщений низкого уровня, таких как WM_KEYDOWN (нажатие клавиши клавиатуры), WM_MOUSEMOVE (перемещение мыши) и других, и позволяет пользователю в первую очередь работать с более информативными сообщениями(например, в некоторое поле введен текст, или нажата кнопка “OK”). Вместо того, чтобы самому писать функцию процедуры окна и указывать в ней все возможные сообщения, пользователь использует стандартный набор макросов библиотеки MFC, позволяющих определить для каждого класса набор обрабатываемых им сообщений.

Вспомним функцию OnPaint из Листинга 4. Можно подумать, что OnPaint – идеальный кандидат на роль виртуальной функции. При таком подходе базовый класс окна определил бы виртуальные функции для сообщений о событиях, связанных с мышью, и других стандартных сообщений, а производные классы могли бы при необходимости их переопеделять. К сожалению, такой подход имеет серьезные недостатки, т.к. класс CWnd, например, должен был бы объявить виртуальные функции более чем для 100 сообщений. Каждый его производный класс потребовал бы таблицу диспетчеризации виртуальных функций, где для каждой функции хранилась бы 4-байтовая запись. Таким образом, для каждого типа окна или элемента управления потребовалось бы хранить таблицу из более чем 400 байтов. Кроме того, в каждом приложении имеется свой набор сообщений от меню, кнопок и других команд, но на все случаи нельзя завести обработчики в базовом классе окна.

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

 

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

 

Поскольку карта сообщений формируется автоматически мастерами Visual C++, нам нет надобности подробно разбираться в ее макросах. Перечислим только некоторые из них.

 

 

Для каждого стандартного сообщения Windows определен свой макрос в форме:

 

ON_WM_XXX // XXX – имя сообщения, например, PAINT для WM_PAINT,



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 47; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.008 с.)