Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

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 асоціюється з відповідним класом, але сам по собі також представляє якусь сутність.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]