В настоящей записке описывается объект карта сообщения MFC.
Проблема
Microsoft Windows реализует, каковы по существу виртуальных функций в классах окон с использованием обмена сообщениями объекта. Из-за большого количества сообщений участвующими предоставление отдельной виртуальной функции для каждого сообщения Windows приводит к чрезмерно большим vtable.
Кроме того поскольку со временем изменяется количество системных сообщений Windows, и конкретного приложения может потребоваться определить некоторые сообщения Windows, карты сообщение механизм обеспечивает уровень косвенного обращения, что предотвращает повреждения существующего кода изменения интерфейса.
Обзор
MFC предоставляет альтернативу оператора switch, используемых в традиционные программы для Windows для обработки сообщений, отправленных в окно. Сопоставление сообщений функций членов может определяться таким образом, чтобы при для обработки в окне сообщения, автоматически вызывается функция соответствующего члена. Этот объект карты сообщение разработан похож на виртуальные функции, но имеет дополнительные преимущества, не представляется возможным с виртуальными функциями C++.
Определение схемы сообщений
Макрос DECLARE_MESSAGE_MAP объявляет три члена для класса.
Этот макрос должен находиться в Декларации любого класса с помощью схемы сообщений. По соглашению это в конце объявления класса. Например:
класс CMyW&nd: государственные CMyParentWndClass
{
nbsp; / / мои вещи...
Охраняемые:
//{{AFX_MSG(CMyWnd)
afx_msg аннулировать OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
Это формат, созданный AppWizard и ClassWizard когда они создают новые классы. / / {{И / /}} скобки необходимы для ClassWizard.
Таблица схемы сообщений определяется набор макросов, которые расширяются для записей сообщений карты. Таблица начинается с вызова макроса BEGIN_MESSAGE_MAP , который определяет класс, который управляется эта схема сообщений и родительского класса, к которому необработанные сообщения проходят. Таблица заканчивается с вызова макроса END_MESSAGE_MAP.
Между вызовами этих двух макросов является запись для каждого сообщения для обработки этой карты сообщений. Каждый стандартный Windows сообщение содержит макрос формы ON_WM_xxx (где xxx-имя сообщения), который создает запись для этого сообщения.
Для распаковки параметров каждого сообщения Windows и обеспечивая безопасность типов была определена стандартная функция подписи. Эти подписи можно найти в файле AFXWIN.H в Декларации от CWnd. Каждый из них помечены словом afx_msg для упрощения идентификации.
Примечание ClassWizard необходимо использовать ключевое слово afx_msg в ваши объявления обработчика сообщения карты.
Эти функции подписи были получены с использованием простой Конвенции. Имя функции всегда начинается с «О». Далее следуют имя Windows сообщения WM_ удалены и лишь заглавной первой буквы каждого слова. Порядок параметров является wParam, за которым следует LOWORD (lParam) , то HIWORD(lParam). Неиспользуемые параметры не передаются. Любые дескрипторы, которые помещаются в классы MFC, преобразуются в указатели на соответствующие объектам MFC. Следующий пример показывает, как обрабатывать сообщение WM_PAINT и вызвать CMyWnd:: OnPaint функция под названием
BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
nbsp; //{{AFX_MSG_MAP(CMyWnd)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Карта таблицу сообщений должен быть определен вне рамок какого-либо определения функции или класса. Он не должен оказаться внутри блока extern «C».
Примечание ClassWizard будет редактировать записи сопоставления сообщений, которые находятся между / / {{и / /}} комментарий кронштейн.
Определяемые пользователем сообщения Windows
Определяемые пользователем сообщения могут быть включены в схеме сообщений, используя макрос ON_MESSAGE . Этот макрос принимает номер сообщения и функции-члена формы:
nbsp; / / внутри объявления класса
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
К примеру:
# define WM_MYMESSAGE (WM_USER + 100)
BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
ON_MESSAGE (WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()
В этом примере мы устанавливаем обработчика для настраиваемого сообщения с идентификатором message ID Windows от стандартной WM_USER базы для пользовательских сообщений. Вы могли бы вызвать этот обработчик с кодом как:
CWnd * pWnd =...;
pWnd-gt;SendMessage(WM_MYMESSA&GE)
Диапазон пользовательских сообщений, этот подход должен быть в пределах WM_USER до 0x7fff.
Примечаниеnbsp; ClassWizard не поддерживает ввод подпрограмм обработчик O&N_MESSAGE из ClassWizard пользовательского интерфейса: Вам необходимо вручную ввести их в редакторе Visual C++. После ввода, ClassWizard будет анализировать эти записи и позволяют вам просматривать так же, как любой другой записей сообщений карты.
Зарегистрированные сообщения Windows
:: RegisterWindowMessage функция используется для определения нового окна сообщения, которое гарантированно является уникальным во всей системе. Для обработки этих сообщений используется макрос ON_REGISTERED_MESSAGE . Этот макрос принимает имя переменной почти UINT, содержащий зарегистрированных windows сообщение идентификатор. Например
класс CMyWnd: государственные CMyParentWndClass
{
общественности:
nbsp; CMyWnd();
//{{AFX_MSG(CMyWnd)
afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
статический UI&NT возле WM_FIND = RegisterWindowMessage("COMMDLG_FIND");
BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
//{{AFX_MSG_MAP(CMyWnd)
ON_REGISTERED_MESSAGE (WM_FIND, OnFind)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Зарегистрированных Windows сообщения Идентификатора переменной (WM_FIND в приведенном выше примере) должна быть почти переменная из-за способа выполнения ON_REGISTERED_MESSAGE.
Диапазон определяемые пользователем сообщения с помощью такой подход будет в диапазоне 0xC000 до 0xFFFF.
Примечаниеnbsp; ClassWizard не поддерживает ввод подпрограмм обработчик O&N_REGISTERED_MESSAGE из ClassWizard Пользовательский интерфейс, необходимо вручную ввести их в текстовом редакторе. После ввода, ClassWizard будет анализировать эти записи и позволяют вам просматривать так же, как любой другой записей сообщений карты.
Команда сообщения
Сообщения команды из меню и ускорители, обрабатываются в картах сообщение с ON_COMMAND макросов. Этот макрос принимает Идентификатор команды, а также функции-члена. Только конкретные WM_COMMAND сообщение с wParam равна указанной команды ID обрабатывается функции-члена указанного в записи сообщений карты. Функции-члены обработчик команды принимают без параметров и возвращать значение типа void. Макрос имеет вид:
ON_COMMAND (id, memberFxn)
Команда update сообщения маршрутизируются через тот же механизм как обработчики ON_COMMAND . Вместо этого используется ON_UPDATE_COMMAND_UI макрос. Функции-члены обработчика команды update принимают один параметр, указатель на объект CCmdUI и возвращать значение типа void. Макрос имеет вид:
ON_UPDATE_COMMAND_UI (id, memberFxn)
Расширенная форма сообщений обработчиков команд доступен для передовых видов использования. Макрос ON_COMMAND_EX вместо этого используется и обеспечивает расширенный набор функций ON_COMMAND . Функции расширенного обработчика команды-члены принимают один параметр, UINT, содержащий Идентификатор команды и возвращают BOOL. BOOL возвращение должно быть значение TRUE, чтобы указать, что команда было обработано, в противном случае маршрутизации будет продолжать другие команды целевых объектов.
Примеры выше форм:
#defi&nenbsp; ID_MYCMD 100
# define ID_COMPLEX 101
afx_msg аннулировать OnMyCommand();
afx_msg аннулировать OnUpdateMyCommand (CCmdUI * pCmdUI);
afx_msg BOOL OnComplexCommand(UINT nID)
ON_COMMAND (ID_MYCMD, OnMyCommand)
ON_UPDATE_COMMAND_UI (ID_MYCMD, OnUpdateMyCommand)
ON_COMMAND_EX (ID_MYCMD, OnComplexCommand)
void CMyClass::OnMyCommand()
{
nbsp; / / обработать команду
}
void CMyClass::OnUpdateMyCommand (CCmdUI * pCmdUI)
{
/ / установить состояние пользовательского Интерфейса с pCmdUI
}
BOOL CMyClass::OnComplexCommand(UI&NT nID)
{
/ / обработать команду
Возвращает значение TRUE;
}
Также доступны для дополнительного использования является ON_COMMAND_RANGE и ON_COMMAND_RANGE_EX , которые позволяют обрабатывать целый ряд команд с помощью одной команды обработчика. Обратитесь к документации для получения дополнительной информации об этих макросов.
Примечаниеnbsp; ClassWizard поддерживает создание обработчиков O&N_COMMAND и ON_UPDATE_COMMAND_UI , но он не поддерживает создание обработчики ON_COMMAND_EX или ON_COMMAND_RANGE . Однако мастер классов будет анализировать и позволяет вам просмотреть все варианты обработчика три команды.
Элемент управления уведомлений
Сообщения, отправляемые от дочерних элементов управления в окне дополнительный бит информации в их сообщении карта вход: идентификатор элемента управления. Обработчик сообщений, указанный в записи карты сообщения вызывается, только если (1 код уведомления управления (высокая слово lParam), такие как BN_CLICKED, соответствует код уведомления, указанный в записи сообщений карты и 1 (2) элемента управления ID (wParam) соответствует Идентификатор элемента управления, указанного в записи сообщений карты.
Сообщения уведомления пользовательский элемент управления могут использовать макрос ON_CONTROL для определения записи карты сообщение с кодом пользовательского уведомления. Этот макрос имеет вид:
ON_CONTROL (wNotificationCode, id, memberFxn)
Для расширенное использование ON_CONTROL_RANGE может использоваться для обработки определенного элемента управления уведомления из целого ряда элементов управления с тем же обработчиком.
ClassWizard не поддерживает создание обработчика ON_CONTROL или ON_CONTROL_RANGE в пользовательском интерфейсе; вручную введите их в текстовом редакторе. После ввода, ClassWizard будет разобрать эти записи и позволит вам просматривать так же, как любой другой записи сопоставления сообщений.
Общие элементы управления Windows использовать более мощные WM_NOTIFY для уведомления сложных элементов управления. Эта версия MFC имеет прямую поддержку для этого нового сообщения с ON_NOTIFY и ON_NOTIFY_RANGE макросов. Обратитесь к документации для получения дополнительной информации об этих макросов.
Технические примечания по номеру |nbsp; Технические примечания по категориям