- •О.С. Зеленський
- •Розділ 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.4. Класи виду
Як вже згадувалося, клас виду відповідає за виведення на екран даних, що зберігаються в об'єкті класу документа, і дозволяє користувачеві модифікувати ці дані. Об'єкт класу виду містить вказівку на об'єкт класу документа, який використовується для доступу до членів-змінним цього класу, де власне і зберігаються дані. Файл заголовка, який AppWizard сформував для класу CApp1View наведемо далі:
// App1View.h : інтерфейс класа CApp1View.
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_APP1VIEW_H__43BB481F_64AE_11D0_9AF3_0080C81A397C__INCLUDED_)
#define AFX_APP1VIEW_H__43BB481F_64AE_11D0_9AF3_0080C81A397C__INCLUDED_
class CApp1View : public CView
{
protected: // Створити тілько у випадку збуружуння-вводу.
CApp1View();
DECLARE_DYNCREATE(CApp1View)
// Атрибути.
publiс:
CApp1Doc* GetDocument();
// Операції.
publiс:
// Перевантаження.
// Перевантажені віртуальні функції,
// сформовані ClassWizard-ом.
//{{AFX_VIRTUAL(CApp1View).
public:
virtual void OnDraw(CDC* pDC); // Перевантажена для
// промальовки в цьому виді.
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC,
CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Реалізація.
public:
virtual ~CApp1View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Сформовані функції карти повідомлень.
protected:
//{{AFX_MSG(CApp1View)
// УВАГА!! Тут ClassWizard буде додавати і
// видаляти функції-члени.
// не редагуйте текст у цих блоках!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG
inline CApp1Doc* CApp1View::GetDocument()
{ return (CApp1Doc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ буде вставляти додаткові
// оголошення перед попереднім рядком.
#endif // !defined(AFX_APP1VIEW_H__43BB481F_64AE_11D0_9AF3_0080C81A397C__INCLUDED_)
На замітку. Більшість програмістів, що мають справу з MFC, включають в клас документа відкриті (public) члени з тим, щоб не ускладнювати доступ до них з об'єкта класу виду. Класичний об'єктно-орієнтований підхід, однак, вимагає включати в клас закриті (private) або захищені (protected) члени-змінні і відкриті члени-функції зчитування та модифікації цих змінних.
Майже на самому початку тексту є секція відкритих атрибутів, в якій оголошена функція GetDocument(), що повертає вказівку на об'єкт класу CApp1Doc. Якщо, працюючи з класом виду, ви побажаєте отримати вказівку на об'єкт класу документа, потрібно буде викликати цю функцію і вона поверне вам потрібну вказівку. Наприклад, для того щоб додати об'єкт класу СРоint у масив таких об'єктів, який є членом класу документа, можна використовувати наступний оператор:
GetDocument()->m_points[x] = point;
Можна зробити те ж саме, запам'ятавши вказівку, що повертається GetDocument(), в локальній змінній, а потім вже використовувати її для доступу до даних документа:
pDoc = GetDocument();
pDoc->m_points[x] = point;
Другий варіант має сенс, якщо ви будете неодноразово використовувати збережену вказівку у функції або якщо вираз у формі GetDocument()->змінна здається вам складним для сприйняття в тексті програми.
На замітку. У поширюваній (release) версії програми функція GetDocument() оголошена як вбудована (inline). Вбудовані функції збільшують продуктивність програми. Вони розширюються при компільованні програми так само, як і макроси, що збільшує розмір виконуваного файлу. Але, на відміну від макросів, компілятор при роботі з вбудованими функціями виконує перевірку типів аргументів.
Зверніть увагу на те, що як клас виду, так і клас документа перевантажують частину функцій-членів своїх базових класів. Як ви незабаром переконаєтеся, функція OnDraw(), яка є однією з найважливіших серед всіх віртуальних функцій, є саме тим інструментом, за допомогою якого здійснюється малювання у вікні програми. Що стосується інших функцій, то MFC викликає PreCreateWindow() перед тим, як створюється і приєднується до об'єкту класу вікон MFC вікно Windows. Ця функція дає можливість модифікувати такі атрибути вікна, як положення та розмір. Ці дві функції обговорюються більш детально в розділі 9. Функція OnPreparePrinting() використовується для модифікації діалогового вікна Print перед його висновком на екран. Функція OnBeginPrinting() дає шанс створити GDI-об'єкт, такий як пензель або перо, який необхідний для виконання деяких завдань в процесі друку. І нарешті, у функції OnEndPrinting() можна знищити будь-який об'єкт, створений функцією OnBeginPrinting(). Всі три згадані функції детально розглядаються в розділі 6.
На замітку. На перших порах, коли ви тільки починаєте працювати з MFC, багатьом здається дуже незвичною різниця між екземпляром класу MFC і елементом Windows, який він представляє. Наприклад, коли ви створюєте об'єкт класу фрейму MFC, насправді створюються два об'єкти - MFC-об'єкт, який має члени-функції та змінні, і вікно Windows, яким можна маніпулювати, використовуючи функції MFC-об'єкта. Елемент Windows асоціюється з відповідним класом, але сам по собі також представляє якусь сутність.