Розділ 1 1 . Обробка командних повідомлень

Існує стандартна послідовність об'єктів програми, яким надсилаються командні повідомлення. Кожен об'єкт у цій послідовності може обробити командне повідомлення, якщо у таблиці повідомлень чи таблиці повідомлень базових класів є відповідна макрокоманда. Необроблені повідомлення передаються далі іншим об'єктам програми.

Порядок обробки командних повідомлень

Об'єкти різних класів обробляють командні повідомлення по-різному. Наприклад, об'єкти, які мають головне вікно програми, спочатку надають можливість обробити отримане повідомлення іншим об'єктам. Тільки якщо повідомлення залишається необробленим, переглядається таблиця повідомлень класу головного вікна програми. Якщо й тут повідомлення не обробляється, воно надсилається іншим об'єктам програми.

В окремих випадках може знадобитися змінити порядок, в якому повідомлення передаються для обробки об'єктів програми. У цьому випадку необхідно перевизначити віртуальний метод OnCmdMsg. Цей метод спочатку визначений у класі CCmdTarget та перевизначений у класах CView та CDocument.

Стандартні послідовності обробки повідомлень

Нижче наведено стандартні послідовності обробки командних повідомлень об'єктами різних класів.

Головне вікно багатовіконної програми. Більшість командних повідомлень передаються головному вікну програми. Для програм, що мають багатовіконний інтерфейс, роль головного вікна програми виконує об'єкт класу CMDIFrameWnd або об'єкт класу, успадкований від базового CMDIFrameWnd.

Отримавши повідомлення, головне вікно програми спочатку дозволяє обробити повідомлення активному дочірньому вікні MDI. Дочірні вікна MDI є об'єктами класу CMDIChildWnd або класу,успадкованого від нього.

І лише якщо вікно MDI не може обробити повідомлення, перевіряється таблиця повідомлень класу головного вікна програми. Слід зазначити, що вікно MDI передає повідомлення іншим об'єктам.

Якщо головне вікно програми також може обробити командне повідомлення, воно передається об'єкту головного класу програми. Головний клас програми успадковується від базового класу CWinApp і додаток має лише один об'єкт цього класу.

Вікна MDI та головне вікно одновіконної програми. Для програм, що мають одновіконний інтерфейс, роль головного вікна програми виконує об'єкт класу CFrameWnd або класу, успадкованого від нього.

Якщо головне вікно одновіконної програми або MDI вікно багатовіконної програми не може обробити повідомлення, воно передається об'єкту головного класу програми.

Об'єкт, що представляє шаблон документа, перевіряє лише власну таблицю повідомлень і передає командні повідомлення іншим об'єктам програми.

Діалогова панель. Діалогові панелі є об'єктами класів, успадкованих від базового класу CDialog, Якщо командне повідомлення, що надійшло об'єкту діалогової панелі, не може бути оброблено, воно передається його батьківському вікну.

Якщо вікно діалогової панелі також не може обробити командне повідомлення, воно передається головному об'єкту програми.

Стандартні командні повідомлення

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

Елемент меню або кнопка панелі керування програми має той самий ідентифікатор, що й командне повідомлення. Нижче описано найважливіші командні повідомлення.

Командні повідомлення із ідентифікаторами ID_FILE_. Дані командних повідомлень відповідають елементам меню File додатків, створених за допомогою засобів MFC AppWizard. Обробники цих повідомлень входять до складу різних класів MFC, у тому числі CWinApp та CDocument.

Командні повідомлення із ідентифікаторами ID_WINDOW_. Дані повідомлення відповідають елементам меню Window багатовіконних програм, створених за допомогою засобів MFC AppWizard. Обробка цих командних повідомлень покладена метод OnMDIWindowCmd класу CMDIFr ameWnd.

Командні повідомлення з ідентифікаторами I D_HELP_. Ці повідомлення використовуються довідковою системою програми.

Клас CWinApp містить методи обробки командних повідомлень, пов'язаний з довідковою системою. Якщо в додатку використовується довідкова система, програміст повинен викликати відповідні методи класу CWinApp для обробки командних повідомлень ID_HELP_.

MFC AppWizard дозволяє створювати програму, яка має довідкову систему. У цьому випадку MFC AppWizard автоматично створює програмний код, необхідний керувати довідковою системою.

Командні повідомлення з ідентифікаторами ID_VIEW_. Ці командні повідомлення відповідають елементам меню View програм, створених за допомогою засобів MFC AppWizard. За обробку командних повідомлень ID_VIEW_ відповідає клас CFrameWnd.