TN006: Сообщение карты

В настоящей записке описывается объект карта сообщения 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, чтобы указать, что команда было обработано, в противном случае маршрутизации будет продолжать другие команды целевых объектов.

Примеры выше форм:

Также доступны для дополнительного использования является 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; Технические примечания по категориям

Index