Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.DOC
Скачиваний:
7
Добавлен:
16.05.2015
Размер:
662.02 Кб
Скачать

4.2 Обробка повідомлень в mfc-програмах

В бібліотеці MFCвсі повідомлення поділяються на три категорії:

  • повідомлення Windows;

  • повідомлення елементів керування;

  • командні повідомлення (команди).

В першу категорію входять апаратні повідомлення (від миші і клавіатури), повідомлення обслуговування вікон, повідомлення про завершення роботи і багато інших. Всі повідомлення цієї категорії починаються з префікса WM_, за виняткомWM_COMMAND.

Друга категорія включає повідомлення від елементів керування і інших дочірніх вікон, які направляються своїм батьківським вікнам. За незначними винятками, механізм передачі повідомлень аналогічний механізму передачі інших WM_повідомлень.

Повідомлення цих двох категорій призначені для об’єктів класів, утворених від бібліотечного класу CWnd.

Третя категорія включає всі повідомлення типу WM_COMMANDвід об’єктів інтерфейсу користувача: меню, кнопок панелей інструментів і клавіш акселераторів. Механізм обробки командних повідомлень відрізняється від обробки інших повідомлень і може проводитися різними об’єктами, включаючи, наприклад, документи, і навіть самим об’єктом “програма”.

Але незалежно від категорії повідомлення, в прикладній програмі вони повинні бути оброблені, тобто програма повинна певним чином відреагувати на надходження повідомлення. При використанні тільки API-функціїWindowsв прикладній програмі, як вже відмічалося в попередньому розділі, є спеціальна віконна функція, де і передбачені оброблювачі повідомлень. ВMFC-програмах аналогом віконної функції виступає карта повідомлень (MESSAGE_MAP). Карта повідомлень перетворює всі категорії повідомлень в функції – обробники відповідних класів.

Розглянемо правила використання карти повідомлень.

По-перше, кожен клас, в якому повинна виконуватися обробка повідомлень, повинен мати власну карту повідомлень. При цьому слід пам’ятати, що вона не може визначатися всередині класу або функції. В класі (зазвичай в самому кінці), лише оголошується карта повідомлень за допомогою макросу DECLARE_MESSAGE_MAP.

Потім, за межами класу, визначається карта повідомлень таким чином. Починається вона макросом BEGIN_MESSAGE_MAP, якому в якості параметрів передається ім’я його “рідного” класу і безпосередньо базового класу. Закінчується карта повідомлень викликом макросуEND_MESSAGE_MAP.

Між вказаними двома викликами розміщуються спеціальні макроси, які власне і зв’язують повідомлення з відповідною функцією – оброблювачем. Для кожної категорії повідомлень визначається свій тип макросу.

Для стандартних повідомлень Windows ім’я такого макросу має формат:

ON_WM_XXX // де XXX – ім’я каталога .

Наприклад, для обробки повідомлення від натиснення лівої клавіші миші, передбачений макрос

ON_WM_LBUTTONDOWN().

Для командних повідомлень формат імені такий:

ON_COMMAND (ID, Func),

де ID –ідентифікатор команди, визначений в ресурсних файлах (*.rc,Resource.h).

Func– ім’я функції–оброблювача.

Прототип функції-оброблювача повинен бути описаний в класі, який є власником карти повідомлень, і має вигляд:

afx_msg void Func(); .

Для оброблення повідомлень від елементів керування застосовується макрос

ON_CONTROL(Code, ID, Func),

де Code –код повідомлення від елемента керування;

ID – ідентифікатор елемента керування, визначений в ресурсних файлах;

Func – ім’я метода-оброблювача.

Крім розглянутих, можуть використовуватися і інші типи макросів, повний список яких можна знайти в файлі afxmsg.h.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]