Цей технічне Примітка надає довідкову інформацію про нове повідомлення 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 повідомлення містять 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.
Якщо вам потрібно обробити те саме повідомлення 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; Технічні примітки за категоріями