- •4 Створення прикладних mfc-програм в середовищі Windows
- •4.1 Структура мінімальної прикладної mfc-програми
- •4.2 Обробка повідомлень в mfc-програмах
- •4.3 Розробка меню в mfc-програмах
- •4.3.1 Перший спосіб підключення меню в mfc-програмах
- •4.3.2 Другий спосіб підключення меню в mfc-програмах
- •4.3.3 Обробка повідомлень від команд меню
- •4.4 Підключення панелі інструментів і рядка стану
- •4.4.1 Створення панелі інструментів
- •4.4.2 Створення рядка стану
- •4.4.3 Приклад програми
- •4.5.1 Контексти пристроїв в mfc-програмах
- •4.5.2 Використання пера та пензля в mfc-програмах
- •Таблиця 4.3 - Класи графічних об’єктів
- •4.5.4 Рисування стандартних геометричних фігур
- •4.5.5 Приклад програми з векторною графікою
- •4.6 Растрова графіка в mfc-програмах
- •4.7 Програмування діалогу в mfc-програмах
- •4.7.1 Основні етапи створення діалогу в mfc-програмах
- •Таблиця 4.4 - ddx-макроси для найбільш поширених ек
- •4.7.2 Організацію обміну даними з полем введення Edit
- •4.7.3 Організація обміну даними зі списком ListBox
- •4.8 Використання dll-бібліотек в mfc-програмах
- •4.8.1 Призначення бібліотек dll
- •4.8.2 Створення власної бібліотеки dll
- •4.8.3 Підключення функцій бібліотеки dll до виконувального файлу
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.