TN061: сообщения ON_NOTIFY и WM_NOTIFY
![]() |
---|
Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации. |
Эта заметка технический предоставляет сведения об истории вопроса в новом сообщении WM_NOTIFY и описывает рекомендованный (и наиболее общий способ обработки сообщения) WM_NOTIFY в приложении MFC.
Сообщения уведомления в окнах 3.x
В окнах 3.x, элементы управления уведомляющие их родительских событий как щелчка мыши, изменения в содержимом и выделение и рисование фона элемента управления путем отправки сообщения к родительскому элементу.Простые уведомления отправляются как особые сообщения WM_COMMAND с кодом уведомления (например BN_CLICKED) и идентификатор элемента управления упаковыванным в wParam и дескриптором элемента управления в lParam.Обратите внимание, что с wParam и lParam полностью, не существует способа передачи дополнительных данных.эти сообщения могут быть только простое уведомление.Например, в уведомлении BN_CLICKED, невозможно отправить информацию о расположении курсора мыши для кнопки была нажата.
Если элементы управления в необходимости окон 3.x отправить сообщение уведомления, которое включает дополнительные данные, они используются разнообразные специализированные сообщения, включая WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM и т дЭти сообщения могут отражать обратно к элементу управления, отправившего их.Дополнительные сведения см. в разделе TN062: Отражение сообщений для элементов управления windows forms.
Сообщения уведомления в Win32
Для элементов управления, которые существовали в Windows 3.1, Win32 API использует большинство сообщений уведомлений, которые использовались в окнах 3.x.Однако Win32 также добавить несколько сложных, сложных элементов управления в разделах, поддерживаемым в окнах 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 tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
Для сообщений TTN_SHOW участник КОД будет присвоено TTN_SHOW.
Большинство уведомления передают указатель на больший структуру, содержащую структуру NMHDR в качестве первого элемента.Например, рассмотрим структуру используется сообщение уведомления LVN_KEYDOWN элементе управления списка, когда клавиша нажата, которое отправляется в элементе управления " список ".Точки указателя на структуру LV_KEYDOWN, которая определена, как показано ниже:
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} LV_KEYDOWN;
Обратите внимание, что поскольку элемент NMHDR первое в этой структуре, указатель которые передаются в сообщение уведомления, может быть приведен к указателю на NMHDR или указателю на LV_KEYDOWN.
Уведомления, общие для всех элементов управления новых окон
Некоторые уведомления, общие для всех элементов управления новых окон.Эти уведомления передают указатель на структуру NMHDR.
Код уведомлений |
Отправлено, поскольку |
---|---|
NM_CLICK |
Нажатие левой кнопки мыши нажатие пользователем в элементе управления |
NM_DBLCLK |
Нажатие пользователем кнопки мыши, дважды левое в элементе управления |
NM_RCLICK |
Пользователь щелкнул правой кнопкой мыши в элементе управления |
NM_RDBLCLK |
Пользователь щелкнул правой кнопкой мыши дважды в элементе управления |
NM_RETURN |
Пользователь отжал клавиша ВВОД пока элемент управления имеет фокус ввода |
NM_SETFOCUS |
Элемент управления получил фокус ввода |
NM_KILLFOCUS |
Элемент управления потерял фокус ввода |
NM_OUTOFMEMORY |
Элемент управления не удалось выполнить операцию, поскольку не хватает памяти |
ON_NOTIFY: Обработка сообщений WM_NOTIFY в приложениях MFC
Обрабатывает сообщения уведомления CWnd::OnNotify функции.Его реализация по умолчанию сопоставление для обработчиков проверяет сообщения уведомления для вызова.Как правило, не переопределяется OnNotify.Вместо этого можно задать функцию обработчика и добавить запись сообщение-сопоставления для обработчика класса для сопоставления сообщения окна владелец.
ClassWizard, на странице свойств ClassWizard, может создать запись сообщение-сопоставления ON_NOTIFY и предоставить его с функцией каркасной обработчика.Дополнительные сведения об использовании ClassWizard, чтобы сделать это, см. в разделе Сопоставление сообщений с функциями.
Макрос сообщение-сопоставления ON_NOTIFY имеет следующий синтаксис:
ON_NOTIFY( wNotifyCode, id, memberFxn )
выделенные курсивом, где параметры заменяются:
wNotifyCode
Код для сообщения уведомлений, которые должны обрабатываться, как LVN_KEYDOWN.id
Идентификатор дочернего элемента управления, для которого отправляется уведомление.memberFxn
Функция-член, вызываемый, когда это уведомление будет отправлено.
В функцию-член должно быть объявлено следующим прототипом:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
Заметки
выделенные курсивом, где параметры:
pNotifyStruct
Указатель на структуру уведомления, как описано в разделе " выше.result
Указатель на код результата будет задано, прежде чем возвратить.
Пример
Чтобы указать, что требуется функции-члена 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: Add your control notification handler
// code here
*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, id, idLast, memberFxn )
выделенные курсивом, где параметры заменяются:
wNotifyCode
Код для сообщения уведомлений, которые должны обрабатываться, как LVN_KEYDOWN.id
Первый идентификатор в сопредельном диапазон идентификаторов.idLast
Последний идентификатор в сопредельном диапазон идентификаторов.memberFxn
Функция-член, вызываемый, когда это уведомление будет отправлено.
В функцию-член должно быть объявлено следующим прототипом:
afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Заметки
выделенные курсивом, где параметры:
id
Идентификатор дочернего элемента управления, отправившего уведомление.pNotifyStruct
Указатель на структуру уведомления, как описано выше.result
Указатель на код результата будет задано, прежде чем возвратить.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Если требуется более одного объекта в маршрутизации обрабатывать сообщения уведомления, можно использовать ON_NOTIFY_EX (или ON_NOTIFY_EX_RANGE), а не ON_NOTIFY (или ON_NOTIFY_RANGE).Единственное различие между версиями ex и обычный версией, что функция-член, вызываемый для версии ex возвращает BOOL, указывающее, должен ли продолжать обработку сообщения.Возвращение Ложь из этой функции позволяет обрабатывать одно и то же сообщение в более чем одном объекте.
ClassWizard не обрабатывает ON_NOTIFY_EX или ON_NOTIFY_EX_RANGE; если необходимо использовать одно из них, необходимо самостоятельно редактирования для сопоставления сообщений.
Заполнитель записи и функции сообщение-сопоставления для ON_NOTIFY_EX и ON_NOTIFY_EX_RANGE следующим образом.Значения параметров такие же, как для подписчиков, отличных от версий ex.
ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )
Заполнитель для обоих из вышеуказанного одинаково:
afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Заметки
В обоих случаях id содержит идентификатор дочернего элемента управления, отправившего уведомление.
Функция должна возвращать Истина если сообщение уведомления полностью обрабатывается или Ложь, если другие объекты в маршрутизации команды должны имеют возможность обработать сообщение.