TN061: ON_NOTIFY и WM_NOTIFY сообщений

Эта техническая записка содержит справочную информацию о новом сообщении WM_NOTIFY и описывает рекомендованных (и наиболее распространенным) способом обработки сообщений WM_NOTIFY в вашем приложении MFC.

Сообщения уведомления в Windows 3.x

В Windows 3.x контроль уведомлять их родителей такие события, как щелчки мышью, изменений в содержание и выбора и управления фон живописи, отправив сообщение на родительский. Простые уведомления отправляются в виде специальных сообщений WM_COMMAND , с кодом уведомления (например, BN_CLICKED) и управлять ID, упакованы в wParam и дескриптор элемента управления в lParam. Обратите внимание, что поскольку wParam и lParam полностью, способом передачи любых дополнительных данных, эти сообщения могут быть только простого уведомления. К примеру в уведомлении BN_CLICKED , невозможно отправить информацию о местоположении курсора мыши при нажатии кнопки.

Когда элементы управления в Windows 3.x нужно послать сообщение уведомления, которое включает в себя дополнительные данные, они используют целый ряд специальных сообщений, включая WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMи так далее. Эти сообщения могут быть отражены обратно в элемент управления, который послал их. Для получения дополнительной информации, смотрите TN062: сообщение отражения элементов управления для Windows.

Сообщения уведомления в Win32

Для элементов управления, которые существовали в Windows 3.1 Win32 API использует большую часть сообщений уведомления, которые были использованы в Windows 3.x. Однако эти элементы управления Win32 также добавляет ряд сложных, сложных элементов управления те, которые поддерживаются в Windows 3.x. часто, должны направить дополнительных данных с их сообщения уведомления. Вместо добавления нового сообщения WM_ * для каждого нового уведомления, которая требует дополнительных данных, дизайнеры Win32 API решили добавить только одно сообщение, WM_NOTIFY, который можно передать любое количество дополнительных данных в стандартизированной форме.

WM_NOTIFY сообщения содержат Идентификатор элемента управления, Отправка сообщения в wParam и указатель на структуру в lParam. Эта структура является NMHDR структура или некоторые более крупные структуры, которая имеет NMHDR структуру своего первого члена. Обратите внимание, что с NMHDR член первый, указатель на эту структуру можно использовать как либо указателя на NMHDR или как указатель на более крупной структуры в зависимости от того, как вы бросили.

В большинстве случаев указатель будет указывать на более крупной структуры, и вам будет нужно привести его, когда вы используете его. В всего несколько уведомлений, такие как общих уведомлений (имена которых начинаются с NM_) и TTN_SHOW управления всплывающей подсказки и TTN_POP уведомления является NMHDR структура, фактически используемая.

NMHDR структура или первоначального члена содержит ручки и Идентификатор элемента управления, отправив сообщение и код уведомления (например, TTN_SHOW). Ниже приведен формат структуры NMHDR:

typedef struct tag&NMHDR {}
 nbsp;  HWND hwndFrom;
    UINT idFrom;
    UINT код;
} NMHDR

Для TTN_SHOW сообщения элемент code будет присвоено TTN_SHOW.

Большинство уведомлений передать указатель на более крупной структуры, содержащую структуру NMHDR в качестве своего первого члена. Например рассмотрим структуру, используется сообщение уведомления LVN_KEYDOWN элемента управления представления списка, которая отправляется при нажатии клавиши в элементе управления представления списка. Указатель указывает на структуру LV_KEYDOWN , которая определяется как показано ниже:

typedef struct tagLV_KEYDOW&N {}
 nbsp;  NMHDR hdr;   
    СЛОВО wVKey;  
    UINT флаги;  
} LV_KEYDOWN

Обратите внимание, что поскольку член NMHDR является первым в этой структуре, указателя, которое вы прошли в сообщении уведомления может быть приведен к указатель на NMHDR или указатель на LV_KEYDOWN.

Уведомления, общие для всех новых элементов управления Windows

Некоторые уведомления являются общими для всех новых элементов управления Windows. Эти уведомления передать указатель на структуру NMHDR.

Код уведомления Отправлено, так как
NM_CLICK Пользователь щелкнул левую кнопку мыши в элементе управления
NM_DBLCLK Пользователь дважды щелкнуть левой кнопкой мыши в элементе управления
NM_RCLICK Пользователь щелкнул правой кнопкой мыши в элементе управления
NM_RDBLCLK Пользователь был дважды щелкнут правой кнопкой мыши в элементе управления
NM_RETURN Пользователь нажатии клавиши ENTER, когда фокус ввода элемента управления
NM_SETFOCUS Элемент управления получает фокус ввода
NM_KILLFOCUS Элемент управления теряет фокус ввода
NM_OUTOFMEMORY Элемент управления не удалось завершить операцию, поскольку там не имелось недостаточно памяти

ON_NOTIFY: Обработка сообщения WM_NOTIFY в приложениях MFC

Функция CWnd::OnNotify обрабатывает уведомительные сообщения. Его реализация по умолчанию проверяет схеме сообщений для обработчиков уведомлений для вызова. В общем вам не следует переопределять OnNotify. Вместо этого предоставляют функцию обработчика и добавить запись в схеме сообщений для этого обработчика в схеме сообщений окна-владельца класса.

ClassWizard, через окно свойств ClassWizard или WizardBar, можно создать записи сообщений карты ON_NOTIFY и предоставить вам функции каркас обработчика. Для получения дополнительных сведений об использовании ClassWizard чтобы сделать это проще, см. Сопоставления сообщений для функций в Visual C++ программист руководство.

ON_NOTIFY карты сообщения макрос имеет следующий синтаксис:

ON_NOTIFY ( wNotifyCode, код, memberFxn )

где курсивом параметры заменяются:

wNotifyCode

Код для сообщения уведомления для обработки, такие как LVN_KEYDOWN.

id

Ребенок идентификатор элемента управления, для которого отправляется уведомление.

memberFxn

Функция-член вызывается, когда это уведомление.

Функция-член должна быть объявлена с следующий прототип:

afx_msgvoidmemberFxn()NMHDR*pNotifyStruct,LRESULT*результат);

где параметры, выделенные курсивом:

pNotifyStruct

Указатель на структуру уведомления, как описано в предыдущем разделе.

результат

Указатель на код результата вам установить перед тем, как вы вернуть.

Пример

Для указания, что требуется для функции-члена OnKeydownList1 для обработки сообщений LVN_KEYDOWN от CListCtrl , Идентификатор которого является IDC_LIST1 , можно использовать ClassWizard для добавить следующее к схеме сообщений:

ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)

В приведенном выше примере функция, представленная ClassWizard —:

void CMessageReflectionDlg::OnKeydownList1 (&NMHDR * pNMHDR, LRESULT * pResult)
{
   LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN *) pNMHDR;
   / / TODO: добавьте обработчик уведомления управления
   / / nbsp;  код здесь
   
   * pResult = 0;
}

Обратите внимание, что ClassWizard указатель надлежащего типа автоматически. Для доступа к структуре уведомления либо pNMHDR илиpLVKeyDow.

ON_NOTIFY_RANGE

Если вам необходимо обработать же WM_NOTIFY сообщение для набора элементов управления, можно использовать ON_NOTIFY_RANGE вместо ON_NOTIFY. Например может возникнуть множество кнопок, для которого требуется выполнить те же действия для определенного сообщения уведомления.

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

ClassWizard не обрабатывает ON_NOTIFY_RANGE; Чтобы использовать его, необходимо отредактировать ваше сообщение карта.

Записи сообщений карты и прототип функции для ON_NOTIFY_RANGE являются следующие:

ON_NOTIFY_RANGE ( wNotifyCode, код, idLast, memberFxn )

где курсивом параметры заменяются:

wNotifyCode

Код для сообщения уведомления для обработки, такие как LVN_KEYDOWN.

id

Первый идентификатор в смежных диапазона идентификаторов.

idLast

Последний идентификатор в смежных диапазона идентификаторов.

memberFxn

Функция-член вызывается, когда это уведомление.

Функция-член должна быть объявлена с следующий прототип:

afx_msgvoidmemberFxn()UINT идентификаторNMHDR*pNotifyStruct,LRESULT*результат);

где параметры, выделенные курсивом:

id

Ребенок идентификатор элемента управления, уведомление.

pNotifyStruct

Указатель на структуру уведомления, как описано выше.

результат

Указатель на код результата вам установить перед тем, как вы вернуть.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

Если вы хотите более одного объекта в уведомлении, маршрутизация для обработки сообщения, используйте ON_NOTIFY_EX (или ON_NOTIFY_EX_RANGE) вместо ON_NOTIFY (или ON_NOTIFY_RANGE). Единственное различие между EX и очередной версии является, что функция-член вызывается для версии EX возвращает BOOL , показывающее ли сообщение обработка должна быть продолжена. Возврат FALSE из этой функции позволяет обработать то же сообщение в более чем одном объекте.

ClassWizard не обрабатывает ON_NOTIFY_EX или ON_NOTIFY_EX_RANGE; Если вы хотите использовать любой из них, необходимо отредактировать ваше сообщение карта.

Карты сообщение вход и прототип функции для ON_NOTIFY_EX и ON_NOTIFY_EX_RANGE являются следующие. Значения параметров являются те же, что не-EX версии.

ON_NOTIFY_EX ( nCode, код, memberFxn )

ON_NOTIFY_EX_RANGE ( wNotifyCode, код, idLast,memberFxn )

Прототип для обоих из вышесказанного является то же самое:

afx_msgBOOLmemberFxn()UINT идентификаторNMHDR*pNotifyStruct,LRESULT*результат);

В обоих случаях id держит ребенка идентификатор элемента управления, уведомление.

Функция должна возвращать значение TRUE , если сообщение уведомления полностью обработаны или значение FALSE , если другие объекты в маршрутизации команд должны иметь возможность для обработки сообщения.

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index