Візуальне програмування і mfc

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

Створення шаблону додатки

Спочатку необхідно вибрати тип створюваного додатка з наданого списку: "Single document" (додаток з одновіконний інтерфейсом), "Multiple document" (додаток з багатовіконний інтерфейс) або "Dialog based" (додаток, засноване на діалогової панелі без головного вікна). Після вибору типу програми "Dialog based" з'явиться наступна діалогова панель, призначена для визначення основних властивостей програми.

У цій панелі можна буде вказати, чи буде у створюваного додатка інформаційна діалогова панель, довідкова підсистема, тривимірні органи управління, можливості використання технології OLE і комунікації за допомогою протоколу TCP / IP. Тут же можна задати заголовок головної діалогової панелі.

На останній діалогової панелі можна задати імена для створюваних системою AppWizard класів додатки.

Після визначення всіх властивостей додатки MFC AppWizard створить проект, який можна відразу ж оттранслировать і отримати додаток, повністю готове до запуску. Після запуску програми на екрані з'являється діалогова панель з двома кнопками "OK" і "Cancel" і статичним полем.

Проект dlg включає в себе ряд файлів, створених системою AppWizard (див. Додаток 1). Розглянемо призначення цих файлів:

Головний клас додатки

Головний клас додатки CDlgApp визначено у файлі dlg.h і реалізований в файлі dlg.cpp.

Для класу CDlgApp описаний конструктор, який не має параметрів. Цей конструктор використовується в момент запуску програми для створення об'єкта класу CDlgApp.

Крім конструктора, в класі CDlgApp переопределяется метод InitInstance базового класу CWinApp. Кожен раз при запуску чергової копії додатку викликається цей метод. Це єдиний метод головного класу, який обов'язково повинен бути перевизначений. Засіб MFC AppWizard реалізує переобумовленої метод InitInstance для різного типу призначеного для користувача інтерфейсу (одновіконний, багатовіконний, заснований на діалозі) по-різному.

Після цього викликається метод DoModal для об'єкта dlg класу CDlgDlg. Він створює діалогову панель і відображає її на екрані. Значення, що видається методом DoModal. можна використовувати для того, щоб проаналізувати результат роботи користувача з діалогової панеллю.

Головний об'єкт докладання

У файлі dlg.cpp оголошується глобальний об'єкт головного класу додатка. Саме з створення цього об'єкта і починається робота програми.

Об'єкт класу CWinApp (або класу, успадкованого від нього) входить у всі програми, створені з використанням MFC AppWizard, незалежно від призначеного для користувача інтерфейсу цієї програми.

Таблиця повідомлень класу

Таблиця повідомлень класу CDlgApp, створена засобом AppWizard, складається з макрокоманд BEGIN_MESSAGE_MAP і END_MESSAGE_MAP. Між ними розташовуються макрокоманди, що визначають повідомлення, оброблювані даним класом. Спочатку в таблиці визначено тільки одне командне повідомлення, що має ідентифікатор ID_HELP. Для його обробки викликається метод OnHelp базового класу.

Необроблені повідомлення передаються на обробку базового класу CWinApp. так як він вказаний у другому параметрі макрокоманди BEGIN_MESSAGE_MAP.

Клас діалогової панелі

Клас головною діалогової панелі оголошується в файлі dlgDlg.h і реалізується в файлі dlgDlg.cpp.

Клас CDlgDlg успадковується від базового класу CDialog. визначеного в бібліотеці класів MFC. Конструктор класу має один необов'язковий параметр pParent, який використовується для передачі індексу головного вікна програми. Роль головного вікна виконує сама діалогова панель, тому параметр pParent не використовується.

Практично з усіма додатками пов'язана піктограма, яка буде відображатися при мінімізації додатки. Зазвичай ця піктограма визначається на етапі реєстрації класу головного вікна програми. Додаток dlg не має справжнього головного вікна - замість нього використовується діалогова панель. Тому відображення піктограми не відбувається автоматично, і, отже, необхідно управляти її відображенням (ідентифікатор піктограми m_hIcon визначено в класі CDlgDlg).

Конструктор класу CDlgDlg викликає конструктор базового класу CDialog. При цьому йому передаються ідентифікатор діалогової панелі і ідентифікатор головного вікна програми.

У тілі конструктора розташований блок AFX_DATA_INIT. У нього ClassWizard буде додавати код ініціалізації елементів даних класу CDlgDlg.

Конструктор також инициализирует m_hIcon, записуючи в нього ідентифікатор піктограми IDR_MAINFRAME:

Метод AfxGetAp повертає покажчик на об'єкт головного класу додатка (в даному випадку - покажчик на об'єкт theApp).

Діалогова панель має тільки кнопки і не має пов'язаних з ними змінних. Однак метод DoDataExchange перевизначений. Фактично він не виконує ніякої роботи. Єдине, що він робить, - це викликає метод DoDataExchange базового класу CDialog.

Якщо до діалогової панелі додати нові органи управління і зв'язати їх засобами ClassWizard з елементами даних класу CDlgDlg, то в блоці AFX_DATA_MAP будуть розміщені виклики функцій DDX і DDV, необхідні для виконання обміну даними.

Таблиця повідомлень класу CDlgDlg містить три макроси, які виконують обробку повідомлень WM_SYSCOMMAND, WM_PAINT і WM_QUERYDRAGICON. Вони розташовані в блоці AFX_MSG_MAP, тому для управління ними використовується ClassWizard.

При відображенні діалогової панелі за допомогою функцій DoModal, Create або CreateIndirect. функція діалогової панелі передається повідомлення WM_INITDIALOG. Безпосереднього доступу до функції діалогу немає. Її реалізація міститься в класі CDialog.

У відповідь на повідомлення WM_INITDIALOG викликається метод OnInitDialog. оголошений як віртуальний метод класу CDialog. Цей метод викликається безпосередньо перед виведенням панелі на екран.

MFC AppWizard в реалізацію цього методу додав кілька дій: додавання рядка до системного меню для виклику короткої довідки про програму, а також за допомогою методу SetIcon вибрав піктограму для додатка.

Якщо під час ініціалізації діалогової панелі метод OnInitDialog встановлює фокус введення іншому органу управління, метод повинен повернути значення FALSE.

Якщо при створенні шаблонного додатки вказати можливість відображення короткої довідкової інформації, то при цьому засіб AppWizard підготує фрагмент коду, який додає відповідний рядок в системне меню, а також метод-обробник OnSysCommand повідомлень від системного меню.

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

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

Діалогова панель на відміну від звичайного вікна не містить вбудованих засобів відображення піктограми програми. Додаток має саме дбати про відображення піктограми - для цього переопределяется метод OnPaint. У цьому методі або викликається метод OnPaint базового класу, або додаток саме відображає піктограму, якщо воно в даний момент мінімізовано.

Користувач може "перетягнути" піктограму минимизированного додатки. Якщо користувач виробляє це дія з піктограмою вікна, для класу якого не визначена піктограма, то викликається метод OnQueryDragIcon. Цей метод повинен повернути ідентифікатор курсора миші, який буде відображатися в момент "перетягування" піктограми вікна.

У перевизначення методі OnQueryDragIcon засіб AppWizard просто повертає ідентифікатор піктограми програми.

Схожі статті