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 повідомлення містять ID елемента керування надсилання повідомлення в wParam і вказівник на структуру в lParam. Ця структура є, або структуру NMHDR або деякі великі структури, яка має NMHDR структуру, її перший членом. Зверніть увагу, що з NMHDR член перший, вказівник до цієї структури можна використовувати або вказівник на є NMHDR , або вказівник на великі структури, залежно від того, як кинув його.

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

NMHDR структура або початковий член містить маркер і ID елемента керування, відправлення повідомлення і повідомлення про код (наприклад, TTN_SHOW). Формат структури NMHDR показано нижче:

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

TTN_SHOW повідомлення член код буде встановлена на 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, хоча control на вході має фокус
NM_SETFOCUS Керування дав фокус вводу
NM_KILLFOCUS Керування втратив фокус вводу
NM_OUTOFMEMORY Контролю не вдалося виконати операцію, оскільки не було достатньо пам'яті доступні

ON_NOTIFY: Обробка WM_NOTIFY повідомлень у MFC додатків

Функція CWnd::OnNotify ручками сповіщень. Його за замовчуванням реалізація перевіряє повідомлення карти для обробників сповіщення для виклику. Загалом, не скасовує OnNotify. Замість цього, ви надати функцію обробник і додати запис повідомлення карта для цього обробника повідомлення карта клас власник вікна.

ClassWizard, через вікна властивостей ClassWizard або перевіркана, можна створити запис повідомлення карта ON_NOTIFY і надати вам функції скелет обробника. Більш докладну інформацію про використання ClassWizard, щоб зробити це легше побачити Відображення повідомлень, які функції в Visual C++ програміста керівництво.

ON_NOTIFY повідомлення карта макросу має такий синтаксис:

ON_NOTIFY (wNotifyCode,id,,memberFxn)

де виділені курсивом параметрів замінюються:

wNotifyCode

Код для сповіщення саміті, такі, як LVN_KEYDOWN.

id

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

memberFxn

При цьому повідомлення функцію член.

Член функція має бути оголошено з наступних прототипу:

afx_msg недійсними memberFxn( NMHDR * pNotifyStruct, LRESULT * результат );

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

pNotifyStruct

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

результат

Вказівник на код результату можна вибрати перш ніж повернути.

Приклад

Щоб вказати, що ви хочете, член функція OnKeydownList1 для обробки повідомлення LVN_KEYDOWN від CListCtrl , ідентифікатор якого IDC_LIST1 , ви повинні використовувати ClassWizard, щоб додати таке повідомлення карти:

ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)

У наведеному вище прикладі є функції, що надаються ClassWizard:

втрати 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, id, idLast, memberFxn )

де виділені курсивом параметрів замінюються:

wNotifyCode

Код для сповіщення саміті, такі, як LVN_KEYDOWN.

id

Перший ідентифікатор у суцільний діапазон ідентифікатори.

idLast

Останній ідентифікатор у суцільний діапазон ідентифікатори.

memberFxn

При цьому повідомлення функцію член.

Член функція має бути оголошено з наступних прототипу:

afx_msgнедійснимиmemberFxn(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 , яка вказує на те, чи слід продовжити обробки повідомлення. Повернення ПОМИЛКОВИХ з цієї функції дозволяє обробляти те ж повідомлення на більш ніж один об'єкт.

Не обробляти 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_msgBOOLmemberFxn(UINT кодNMHDR*pNotifyStruct,LRESULT*результат);

В обох випадках id тримає дитину ідентифікатор елемента керування, який надіслав повідомлення.

Ваш функція також має повернути TRUE якщо сповіщення про повідомлення повністю обробляються або ПОМИЛКОВИХ якщо інші об'єкти в маршрутизації команда повинна мати можливість обробляти повідомлення.

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

Index