- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
1.4. Короткий опис mdi програми
MDI-додаток має меню, але дозволяє користувачеві одночасно працювати більш ніж з одним документом. У цьому розділі будуть розглянуті тексти програм, які створює AppWizard при виборі такого виду програми. При цьому вибирається наступне налаштування: відсутня підтримка операцій з базами даних та складеними документами, але є панель інструментів та рядок стану, оперативна довідка, коментарі в тексті програми, функції з бібліотеки MFC підключені у вигляді DLL-модулів. Як і у випадку із SDI-додатком, це налаштування AppWizard пропонує за замовчуванням на всіх етапах після першого. Основна увага в цьому розділі приділяється відмінностям у тексті програм від розглянутого в попередньому розділі SDI-додатку. За допомогою майстра AppWizard створимо додаток FirstMDI. При цьому створюється шість класів, назви яких перераховані нижче.
• CAboutDlg – клас діалогу для вікна About.
• CFirstMDIApp – клас для програми в цілому, породжений CWinApp.
• CFirstMDIDoc – клас документа.
• CFirstMDIView – клас виду.
• CMainFrame – клас фрейму вікна.
• CChildFrame – клас вікна, який зв’язує між собою класи документа та вікна виду.
Заголовок Арр-класу додатку представлений нижче:
FirstMDI.h - головний файл заголовка для програми FirstMDI
// FirstMDI.h: Головний файл заголовка для програми FIRSTMDI
//
#if !defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_)
#define AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#ifndef __AFXWIN_H__
#error включення stdafx.h передує включенню цього файлу для РСН
#endif
#include "resource.h" // Головні символи.
/////////////////////////////////////////////////////////////////////////////
// CFirstMDIApp:
// Використання цих класів наводиться в FirstMDI.cpp.
//
class CFirstMDIApp: public CWinApp
{
public:
CFirstMDIApp();
// Перевантаження.
// Перевантажені віртуальні функції,
// сформовані ClassWizard-ом.
//{{AFX_VIRTUAL(CFirstMDIApp).
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Реалізація.
//{{AFX_MSG(CFirstMDIApp)
afx_msg void OnAppAbout();
// УВАГА!! Тут ClassWizard буде додавати і
// видаляти функції-члени.
// не редагуйте текст у цих блоках!
//}} AFX_MSG
DECLARE_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ буде вставляти додаткові
// оголошення перед попереднім рядком.
#endif // !defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_)
У чому ж відмінність цього файлу від FirstSDI.h? Тільки в іменах класів. Навіть конструктор той же самий. Функція OnAppAbout() в точності повторює варіант для SDI-додатків. Текст функції InitInstance() наступний:
BOOL CFirstMDIApp::InitInstance()
{
AfxEnableControlContainer();
// Стандартна ініціалізація.
// Якщо ви не будете використовувати цю функцію або
// бажаєте зменшити розмір виконуваного модуля,
// видаліть ті із наступних нижче підпрограм
// ініціалізації, у яких немає необхідності.
#ifdef _AFXDLL
Enable3dControls(); // Цю функцію слід викликати у тому
// випадку, якщо використовуються DLL-модулі MFC.
#else
Enable3dControlsStatic(); // Цю функцію слід викликати
// у тому випадку, якщо функції з MFC
// прикомпоновуються статично.
#endif
// Змініть ключ реєстрації, під яким зберігаються
// установки.
// Цей рядок потрібно змінити відповідно найменуванню
// вашої фірми або організації.
SetRegistryKey(_T("Local AppWizard-Generated Applications")
LoadStdProfileSettings(); // Завантажити стандартний
// файл опцій INI (включаючи MRU).
// Зареєструвати шаблон документа. Шаблон документа
// служить в якості сполучної ланки між документами,
// фреймом вікна і видами.
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_FIRSTMTYPE,
RUNTIME_CLASS(CFirstMDIDoc),
RUNTIME_CLASS(CChildFrame), // Фрейм дочірніх вікон MDI.
RUNTIME_CLASS(CFirstMDIView));
AddDocTemplate(pDocTemplate);
// Створити фрейм головного MDI-вікна.
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// Розбиття командного рядка для команд оболонки, DDE
// і відкриття файлів.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Розподілити функції, задані в командному рядку,
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// Головне вікно програми ініціалізований, так що можна
// показати і поновити його.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
return TRUE;
}
У чому ж різниця? Тут допоможе WinDiff – засіб, який входить до складу Visual C++ і викликати який можна з меню Tools (Інструменти). Використовуючи WinDiff, порівняйте версії функції InitInstance() в файлах програм додатків FirstSDI та FirstMDI. Після порівняння видно, що, крім імен класів, є такі відмінності.
• MDI-додаток формує екземпляр класу CMultiDocTemplate, a SDI-додаток – класу CSingleDocTemplate. Докладно про це буде розказано у розділі 9.
• MDI-додаток організовує головне вікно і потім виводить його на екран.
• має місце клас дочірнього вікна MDI-додатку CChildFrame, який зв’язує між собою класи документа та вікна виду (у SDI-додатку це клас головного вікна CMainFrame).
Це порівняння дає чітке уявлення про переваги парадигми Документ/Вид – досить серйозна відмінність у функціонуванні програми досягається невеликими фрагментами текстів програм проекту, причому наскільки це можливо всі подробиці їх реалізації приховані від розробника.