- •О.С. Зеленський
- •Розділ 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. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
3.3. Клас документа
Формуючи текст програми за допомогою AppWizard, ви маєте можливість оснастити додаток: панеллю інструментів, рядком стану, різноманітними меню і навіть вікном повідомлення про авторські права. Однак корисність такого додатка дорівнює нулю. Для того щоб створити програму, що не тільки добре виглядає на екрані, але і робить щось корисне, вам доведеться втрутитися в текст програми, яку підготував AppWizard.
Можливо, найбільш істотним змінам піддасться частина підготовленої AppWizard програми, пов'язана з документом - інформацією, яку користувач може зберігати в процесі роботи з додатком і потім зчитувати, - і з видами - засобами подання цієї інформації користувачеві в процесі виконання програми. Покладена в основу MFC концепція документ / вид дозволяє відокремити дані від засобів, за допомогою яких користувач має можливість переглянути ці дані та маніпулювати ними. Коротше кажучи, об'єкти-документи відповідальні за зберігання, завантаження і вивантаження даних, а об'єкти-види, які часом є ті ж вікна, дозволяють користувачеві переглядати дані на екрані і редагувати їх відповідно логіці роботи програми. У цій главі ви познайомитеся з основами роботи MFC в частині реалізації концепції документ / вид.
Створюючи SDI-і MDI-додатки, AppWizard спочатку закладає в них засоби, орієнтовані на реалізацію концепції документ / вид. Це означає, що AppWizard формує клас, похідний від CDocument, і передає йому певні завдання. Він також формує клас виду, похідний від CView, якому передає інші завдання. Давайте замовимо AppWizard простий додаток і подивимося, що він нам видасть.
Виберіть File → New, потім вкладку Projects. Встановіть ім'я проекту Арр1 та відповідні каталоги для файлів проекту. Перевірте, щоб був обраний варіант MFC AppWizard (ехе) у лівому вікні. Клацніть на ОК.
Пройдіться по всім діалоговим вікнам AppWizard, замовляючи установки відповідно до наведеного нижче списком і кожен раз клацаючи на Next.
• Етап 1. Виберіть Multiple documents.
• Етап 2. Не міняйте налаштувань, запропонованих AppWizard за замовчуванням.
• Етап 3. Не міняйте налаштувань, запропонованих AppWizard за замовчуванням.
• Етап 4. Скиньте всі прапорці, крім Printing and print preview (Друк і попередній перегляд роздруківки).
• Етап 5. Не міняйте налаштувань, запропонованих AppWizard за замовчуванням.
• Етап 6. Не міняйте налаштувань, запропонованих AppWizard за замовчуванням.
На останньому етапі клацніть на кнопці Finish, і параметри виконаних налаштуваннь будуть виведені у вікні New Project Information (Інформація про новий проект). Після клацання на кнопці OK ClassWizard сформує проект. У вікні ClassView перегляньте список класів додатку. Створено шість класів: CAboutDlg, CApp1App, САрр1Dос, CApp1View, CChildFrame та CMainFrame.
Клас САрр1Dос представляє, документ і містить структуру даних, якими може оперувати додаток. Організувати зберігання даних у класі можна включенням до нього відповідних членів-змінних. Текст файлу заголовка, який AppWizard сформував для класу CApp1Doc:
// App1Doc.h : інтерфейс класа CApp1Doc.
//
///////////////////////////////////////////////////////////////
#if !defined(AFX_APP1D0C_H__43BB481D_64AE_11D0_9AF3_0080C81A397C__INCLUDED_)
#define AFX_APP1D0C_H__43BB481D_64AE_11D0_9AF3_0080C81A397C__INCLUDED_
class CApp1Doc : public CDocument
{
protected: // Создаются только в случае сохранения-восстановления.
CApp1Doc();
DECLARE_DYNCREATE(CApp1Doc)
// Атрибути.
public:
// Операції.
public:
// Перевантаження.
// Перевантажені віртуальні функції,
// сформовані ClassWizard-ом.
//{{AFX_VIRTUAL(CApp1Doc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Реалізація.
public:
virtual ~CApp1Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Карта повідомлень.
protected:
//{{AFX_MSG(CApp1Doc)
// УВАГА!! Тут ClassWizard буде додавати і
// видаляти функції-члени.
// не редагуйте текст у цих блоках!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT,LOCATION}}
// Microsoft Visual C++ буде вставляти додаткові
// оголошення перед попереднім рядком.
#end if // !defined(AFX_APP1D0C_H__43BB481D_64AE_11D0_9AF3_0080C81A397C__INCLUDED_)
Майже на самому початку класу є секція Атрибути, за якою слідує ключове слово publiс. Саме тут вам і потрібно буде вставити оголошення членів-змінних, в яких планується зберігати дані програми. Наприклад в додатку потрібно буде зберігати масив об'єктів класу СРоint. Цей масив оголошується як член класу документа:
// Атрибути.
publiс:
СРоint m_points[100];
CPoint – це клас MFC, який інкапсулює інформацію, що має відношення до точки на екрані, зокрема - координати цієї точки x і y.
У тексті файлу заголовка зверніть увагу також на те, що клас САрр1Dос має дві віртуальні функції-члени - OnNewDocument() і Serialize(). MFC викликає функцію OnNewDocument(), як тільки користувач вибере команду File → New (або відповідну піктограму на панелі інструментів, якщо така є присутньою у додатку). Цю функцію можна використовувати для виконання всіх ініціалізацій, необхідних новій порції даних. У SDI-додатку в такому випадку закривається відкритий документ і новий порожній документ завантажується в той же самий об'єкт класу. У MDI-додатку відкривається новий порожній документ (створюється новий екземпляр класу документа) на додаток до вже існуючого. Функція Serialize() використовується для завантаження в файл і вивантаження з нього даних, що зберігаються в членах-змінних об'єкта класу документа. Про це більш детально буде розказано у розділі 7.