Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TPG_BOOK_02_02.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.74 Mб
Скачать

2 Створення каркасу mfc-програми

2.1 Загальна інформація про MFC

Створення програм для операційної системи Microsoft Windows у „кла-сичному” випадку має містити виклик функції WinMain() та інших функцій прикладного інтерфейсу Windows – WinAPI. Такий спосіб надає можливість повністю контролювати створення та виконання програми на „низькому” рівні функцій прикладного інтерфейсу, але навіть проста програма, створена таким шляхом, займатиме декілька сторінок коду.

Тому, різні виробники засобів розробки програмного забезпечення запропонували спростити шлях розробки Windows-програм за допомогою використання спеціальних бібліотек. Так фірма Borland запропонувала бібліотеку OWL (Object Window Library), Microsoft – бібліотеку MFC (Microsoft Foundation Classes). Ці бібліотеки використовують концепцію об’єктно-орієнтованого програмування, на відміну від підходу WinAPI, який орієнтовано на класичну мову Сі. Якщо порівнювати ці бібліотеки, можна знайти багато спільного, це не дивно, бо обидві бібліотеки у дещо різний спосіб спрямовуються до однієї мети – створення Windows-програм. Слід зазначити, що згодом фірма Borland розробила і більш досконалий засіб – Visual Components Library (VCL), який реалізує й іншу, швидку концепцію розробки програм – Rapid Application Design (RAD).

То ж перейдемо до MFC.

Абревіатуру MFC (Microsoft Foundation Classes) можна перекласти як Базові класи Microsoft. MFC – є набором класів C++, створених для реалізації функціональних можливостей програмних додатків, написаних Microsoft для операційних систем Windows.

Бібліотека MFC містить більше 200 класів. MFC призначена для спрощення процесу програмування. Це спрощення, головним чином, полягає у багаторазовому використанні одного й того ж самого коду, реалізації компонентів графічного інтерфейсу Windows (вікна, елементи керування, графічні пристрої та ін.), як об’єктів мови програмування С++, у реалізації функцій компонентів Windows.

Відомо, що для спрощення сприйняття програмного коду використовують узгодження імен змінних. Це передбачає, що зазвичай змінна певного типу має стандартний префікс. Символи префіксів наведені у таблиці 2.1.

Таблиця 2.1 – Символи префіксів типів змінних MFC

Префікс

Тип даних

1

2

B

булевий (один байт)

C

символ (один байт)

C

клас

Dw

довге беззнакове

F

16-розрядне бітове поле (прапорець – flag)

Fn

функція

Продовження табл. 2.1.

1

2

H

дескриптор (засіб опису)

L

довге ціле

Lp

довгий покажчик

N

коротке ціле

P

покажчик

Pt

довге ціле, що зберігає екранні координати

W

коротке безнакове ціле

Sz

покажчик на рядок, що завершується символом ‘\0’

lpsz

довгий покажчик на рядок, що завершується символом ‘\0’

rgb

довге ціле, що зберігає значення кольору у форматі RGB

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

Таблиця 2.2 – Деякі типи бібліотеки MFC

Позначення типу

Опис

HANDLE

дескриптор об'єкта

HWND

дескриптор вікна

BYTE

байт (8 бітів)

WORD

слово без знака (16 бітів)

DWORD

подвійне слово (32 біти)

UINT

беззнакове ціле число

BOOL

булева змінна (має бути TRUE або FALSE)

LONG

32-розрядне значення із знаком

LPSTR

покажчик на рядок символу Windows із нульовим символом у кінці

LPCSTR

показник на константний рядок символу Windows із нульовим символом у кінці

Можна побачити, що деякі з типів, наприклад BOOL, за записом і змістом майже збігається зі стандартним bool, але, насправді, це різні типи. Тип BOOL відображає специфіку MFC, саме його значення повертається функціями MFC, про що нагадає компілятор у випадку застосування типу bool.

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

Якщо досліджувати ієрархію MFC класів, можна побачити, що майже кожен клас у бібліотеці походить з класу CObject. Складається враження, що CObject, який знаходиться у вершині MFС – за структурою величезний і складний. Однак, як це не дивно, CObject – один з найменших класів у MFC. Будь-який клас користувача, який призначається для збереження або завантаження даних (так званий процес серіалізації), має виводитися безпосередньо або побічно, від CObject.

CObject забезпечує: підтримку серіалізації, ведення інформації про виконання класу, вивід діагностичної інформації, сумісність з іншими класами.

CObject не підтримує множинну спадкоємність. Класи користувача можуть мати тільки один базовий клас CObject.

Властивості СObject успадковані декількома класами. Стисла їх схема наведена на рисунку 2.1.

Рисунок 2.1 – Ієрархія зв’язків декількох основних класів MFC

Серед класів-спадкоємців СObject – CCmdTarget, CException, CFile, CMenu, CDC, CGdiObject.

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

CException забезпечує обробку усіх виключних ситуацій MFC.

CFile – базовий клас для обробки файлів, який безпосередньо забезпечує функції введення-виведення. CFile разом з класом CArchive класом забезпечують процес серіалізації об’єктів MFC.

Клас CMenu реалізує меню Windows і за своїми властивостями походить зі структури HMENU. Він забезпечений функціями-членами для створення, відображення, модифікації та вилучення меню.

Клас CDC визначає так звані об'єкти контексту пристрою. Об'єкти класу CDC забезпечують функції роботи з контекстом пристрою. Контекстом пристрою можуть бути дисплей або принтер, тому у CDC забезпечуються функції роботи з контекстом дисплея, пов'язаним з клієнтською областю вікна програми.

Клас CGdiObject є базовим у взаємодії із інтерфейсом GDI системи Windows (інтерфейс графічних пристроїв) і забезпечує обробку бітових зображень, пір’я, пензлів, палітр, шрифтів. Об’єкти CGdiObject ніколи не створюються безпосередньо, використовуються лише об’єкти похідних класів. Скоріше за все, ви створюватимете об'єкти похідних від CGdiObject класів, наприклад, типу CPen або CBrush (відповідно перо та пензель).

Від класу CCmdTarget породжується дуже важливий MFC клас – CWnd. CWnd забезпечує основні функціональні можливості всіх класів вікна у бібліотеці MFC.

Об'єкт CWnd внутрішньо відрізняється від вікна Windows, але обидва є тісно пов’язаними. Об'єкт класу CWnd створюється та вилучається конструктором та деструктором цього ж класу. Вікно Windows, з іншого боку, є внутріш-ньою структурою Windows, яка створюється функцією Create() (член класу CWnd), та вилучається віртуальним деструктором класу CWnd. Функція DestroyWindow() видаляє вікно Windows, не видаляючи власне об'єкт.

У свою чергу, CFrameWnd клас забезпечує функціональні можливості так званого однодокументного інтерфейсу Windows SDI (Single Document Interface), і забезпечує відповідні функції вінка, багато з яких виведені з батьківського для CFrameWnd – класу CWnd.

Об'єкт класу CWinThread представляє потік виконання програмного додатка. Основний потік виконання забезпечується об'єктом, виведеним з класу CWinApp, який сам виводиться з CWinThread. Додаткові об'єкти CWinThread дозволяють отримати багатопотоковий режим виконання програмного додатка.

Таким чином, CWinApp є базовим класом, з якого унаслідується об'єкт прикладки Windows. Об'єкт прикладки забезпечує ініціалізацію програмного додатка та його запуск.