Шаг 287 - Извещения Notification и чем они отличаются от сообщений

В Windows 3.1 элементы управления посылали сообщения о своем состоянии, например, нажатии кнопки или изменении выбора используя сообщение WM_COMMAND с кодом состояния, например, BN_CLICKED и идентификатором помещенным в IParam и дескриптором в WParam. Как видите все занято и дополнительную информацию послать нельзя. Например, положение мыши. Для посылания дополнительных данных использовались дополнительные сообщения типа:

......
WM_VSCROLL 
WM_HSCROLL 
WM_DRAWITEM 
WM_MEASUREITEM
......

Поддержка этих сообщений в WIN32 осталась, но теперь при необходимости передачи новых данных решено использовать не создание новых сообщений, так как это связано с переработкой API, а универсального извещения WM_NOTIFY. Вместе с ним можно передать любое количество дополнительных данных.

WM_NOTIFY сообщения содержат идентификатор элемента управления посылающего сообщение в wParam и указатель на структуру в lParam. Это структура NMHDR, она описана в "Подробности - Структура NMHDR". Здесь есть некоторые тонкости. Дело в том, что структура может быть намного больше. То есть структура NMHDR будет первой структурой внутри другой большой структуры. Фактически структурой NMHDR является очень маленькое извещение, обычно это более большая структура. Например, извещение LVN_KEYDOWN - это вот такая структура:

typedef struct tagLV_KEYDOWN 
{
    NMHDR hdr;   
    WORD wVKey;  
    UINT flags;  
} LV_KEYDOWN;

Как видите указатель на эту структуру можно привести и к NMHDR и к LV_KEYDOWN. Каждый новый элемент управления Windows поддерживает следующие извещения:

Пример когда структура больше чем NMHDR смотрите в "Шаг 182 - Редактирование по месту CTreeView", там как раз обрабатываются подобные извещения. Как обрабатывать извещения без Class Wizard в "Шаг 255 - Использование Windows Common Controls".


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.