- •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 Створення прикладних mfc-програм в середовищі Windows
Структура програм в середовищі Windows значно спрощується при використанні спеціальної бібліотекиMicrosoft Foundation Classes (MFC).Перехід до бібліотекиMFCозначає перехід до об’єктно-орієнтованого програмування мовою С++.
Бібліотека MFCпобудована за ієрархічним принципом. На вершині ієрархії знаходиться єдиний класCObject. Всі інші класи можна умовно розбити на дві категорії: похідні від класу CObject, і класи, що не залежать від CObject.Класи, які описують окремі компонентиWindows(вікна, діалоги, графіку тощо), як правило, створюють локальну ієрархію зі своїм базовим класом.
Кожен клас надає програмісту велику кількість різноманітних функцій. Оскільки в програмах можна використовувати як АРІ-функції, так і функції класів, тому, щоб їх розрізнити, останні будемо називатиMFC-функціями або методами.
4.1 Структура мінімальної прикладної mfc-програми
Перед тим як приступити до написання складних програм, розглянемо структуру найпростішої програми, завданням якої є лише виведення вікна програми на екран. В попередньому розділі ми реалізували цю задачу з допомогою API-функцій мовою С. Об’єм наступної програми буде в декілька раз менший.
Мінімальна MFC-програма містить два класи, які визначаються користувачем.
Перший клас СMyApp, є похідним від бібліотечного класуCWinAppі призначений для створення глобального об’єкта класу прикладних програм. Базовий класCWinAppмає всього два методи: конструктор і функцію ініціалізаціїInitInstance(). Перевизначаючи останнюMFC-функцію, програміст одержує можливість керувати ініціалізацією прикладної програми.
Починається перевизначувана MFC-функціяInitInstance() зі створення об’єкта фрейму вікна:
CMyFrameWnd *pMainWnd=new CMyFrameWnd;
потім із встановлення його як головного вікна прикладної програми
m_pMainWnd=pMainWnd; .
Далі вікно необхідно зробити видимим:
m_pMainWnd->ShowWindow(m_nCmdShow);
і поновити його вміст:
m_pMainWnd->UpdateWindow(); .
Дуже корисно зупинитися на особливостях позначень імен в бібліотеці MFC.
В якості префікса, який позначає ім’я класу, використовується заглавна буква Свід словаclass, за який йде власне ім’я класу. НаприкладCWnd, CWinApp, CDialogі інші. Такий же префікс рекомендується використовувати і для імен класу користувача.
Для членів класу прийнятий такий спосіб утворення імен: обов’язковий префікс m_ (від слівclass member), за яким йде префікс, який характеризує тип даних, а потім йде власне ім’я змінної, наприкладm_pMainWnd, дер– префікс покажчика. Для найменування змінних, які не є членами будь-якого класу, префіксm_ не використовується.
Кожна MFC-програма буде практично завжди містити хоча б один клас, похідний від бібліотечного віконного класу. В наступній мінімальнійMFC-програмі визначається власний класCMyFrameWnd, як похідний від класуCFrameWnd.
На клас CFrameWndпокладається багато задач, зокрема:
створення перекриваючих і висхідних вікон,
створення меню,
створення панелей інструментів і рядка стану,
створення акселераторів команд,
- підтримка операції ”перенести і відпустити” (drag-and-drop). Якщо більш коротко визначити призначення класуCFrameWndто необхідно сказати, що з його допомогою легко створювати фрейми вікон (Window frames). Фрейм представляє собою видиму рамку і стандартні елементи вікна (смуга заголовка, кнопки максимізації і мінімізації, меню, панель інструментів, рядок стану) (рис. 4.1).
В нашій мінімальній MFC-програмі конструктор класуCMyFrameWndвикликає методCreate(), призначений для встановлення початкових параметрів вікна.
Розглянуті вище функції і методи класів CMyAppіCMyFrameWndвідповідають за створення, відображення, і відновлення вікна, реєстрацію класу вікна, тобто виконує ті ж дії, що й функціяWinMain() в мінімальнійAPI-програмі дляWindowsна мовоюС. Залишилось тільки розглянути особливості виконанняMFC-програм.
Виконання цієї найважливішої задачі взяла на себе функція Run() класуCMyApp. Результатом виклику цієї функції і є запуск циклу обробки повідомлень і поява на екрані стандартного вікнаWindows, точно такого ж, як і при виконанні мінімальноїАРІ-програми. Саме томуMFC-програма і закінчується викликом стандартної функціїRun().
Нарешті, не забути на самому початку програми підключити бібліотеки MFCдо програми:
#include <afxwin.h> .
Через файл afxwin.hпідключаються всі інші заголовочні файли, включаючиwindows.h.
В результаті отримаємо варіант мінімальної MFC-програми.
Рисунок 4.1 – Вікно MFC-програми
#include <afxwin.h>
class CMyFrameWnd:public CFrameWnd
{
public:
CMyFrameWnd();
};
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL,"My first program",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
};
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyApp::InitInstance()
{
CMyFrameWnd *pMainWnd=new CMyFrameWnd;
m_pMainWnd=pMainWnd;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
};
CMyApp app; .