Оголошення класу представлення

Лекція № 7

Тема: Клас CView

План

1. Оголошення класу представлення

2. Аналіз функцій-членів класу cview

3. Робота з представленнями і повідомленнями

 

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

Вікно представлення, у свою чергу, є дочерним вікном фреймового вікна. У додатку SDI вікно представлення є дочерним головного фреймового вікна, а в додатках MDI вікно представлення є дочерним вікном дочірнього вікна MDI . Крім того, фреймове вікно здатне містити фрейм OLE (упроваджений об'єкт), а також забезпечувати його редагування по місцю вставки, якщо додаток підтримує таку можливість. Фреймове вікно, у свою чергу, може містити декілька вікон представлення (наприклад, при розбитті вікон (split window)).

 

Оголошення класу представлення

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

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

Виходячи з вищесказаного, ймовірно, краще всього оголосити коефіцієнт маштабування як змінну-член класу представлення, як показано нижче, а не як змінну-член класу документа:

 

class CZoomView : public CView

{

protected:

CZoomView () ;

DECLARE_DYNCREATE(CZoomView)

public:

CZoomableDoc* GetDocument();

WORD m_wZoomPercent;

}

 

Проте, важливішою є змінна-член, що містить поточний вибір, а не змінні-члени, що містять значення коефіцієнта масштабу. Поточний вибір (current selection) — це елемент колекції об'єктів усередині документа, вибраний користувачем зараз. Характер і тип дій, які користувач може здійснити, повністю залежать від додатку і можуть включати такі операції, як копіювання в буфер обміну, вирізування, а також забезпечення перетягання (технологія OLE drag-and-drop).

Найпростішим способом реалізації поточного вибору є використання класу колекції. Наприклад, що підтримує поточний вибір колекцію можна оголосити таким чином:

 

class CSelectableView : public CView {

// тут розташована решта коду

CList <CDocItem *, CDocItera *> m_SelectList;

//

}

 

Окрім внесення змін до оголошення класу представлення, необхідно створити одну або декілька функцій-членів, що дозволяють класу представлення реагувати на дії користувача при виборі (наприклад, заповнення і звільнення списку). До речі, функцію-член OnDraw необхідно перевизначати завжди. Задана за умовчанням реалізація функції OnDraw ніяких дій не виконує, тому необхідно написати код, що відображає дані документа, навіть якщо клас представлення не містить власних змінних-членів.

Наприклад, якщо клас документа є похідним від COleDocument і використовує для зберігання даних документа клас CDocItern, функція-член OnDraw для даного класу, ймовірно, виглядатиме таким чином:

 

void COleCapView::OnDraw(CDC *PDC)

{

COLECapDoc *pDoc = GetDocument();

ASSERT_VALID{pDoc);

POSITION posDoc = pDoc->GetStartPosition();

while (posDoc != NULL)

{

CDocItem *pObject = pDoc->GetNextItem(posDoc);

if <PObject->IsKindOf (RUNTIME_CLASS (CNorrnDocItem)))

(

((CNorrnDocItem *)pObject)->Draw(pDc);

}

else if (pObject->IsKindOf(RUNTIME_CLASS{COleDocItem)))

{

((COleDocItem *)pObject)->Draw(pDc);

} else

ASSERT(FALSE);

}

}