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 содержит идентификатор дочернего элемента управления, отправившего уведомление.

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

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям