Эта техническая записка содержит справочную информацию о новом сообщении 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.
Для элементов управления, которые существовали в 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.
Если вам необходимо обработать же 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; Технические примечания по категориям