69287

Клас CView

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-10-02

50 KB

0 чел.

Лекція № 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);

}

}

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

Подібно до класу CDocument, клас CView надає широка різноманітність функцій-членів, які можна використовувати як в початковому вигляді, так і в перевизначеному, що дозволяє забезпечити специфічні функціональні можливості додатку. Серед функцій-членів класу CView найчастіше використовується функція GetDocument, що повертає покажчик на об'єкт документа, який був заздалегідь пов'язаний з даним представленням. Інший, достатньо часто використовуваною функцією-членом є DoPreparePrinting, яка відображає діалогове вікно Print (Друк), а також, на підставі вибраних користувачем усередині цього діалогового вікна параметрів, створює контекст пристрою принтера.

Що не єдиними підлягають перевизначенню функціями-членами класу CView є GetDocument і DoPreparePrinting. Решта всіх функцій-членів класу CView можна перевизначати. Більшістю цих функцій-членів є перевизначені функції, що надаються класом CWnd (який є базовим для класу CView). Крім того, тут представлені функції-члени, оброблювальні переважну більшість подій призначеного для користувача інтерфейсу. Марно намагатися перерахувати все більш або менш заслуговуючі уваги функції-члени — їх дуже багато. Проте відзначимо, що серед них є функції, що відповідають за обробку повідомлень клавіатури, миші, таймера, операційної системи, за реакцію на події буфера обміну і вікон MDI, а також на повідомлення ініціалізації і завершення роботи додатку. У додатку необхідно відповідним чином перевизначити ці функції-члени класу представлення. Наприклад, якщо додаток дозволяє користувачеві упроваджувати в документ зовнішні об'єкти (перетягуючи їх мишею), то для забезпечення такої можливості необхідно перевизначити функцію-член CWnd::OnLButtonDown. Зазвичай для цього використовується майстер ClassWizard, який самостійно створює перевизначення всіх необхідних функцій, а розробникові залишається додати свій власний код в розділі, поміченому майстром коментарем TODO.

Застосовуючи клас CView, більшість додатків перевизначають ряд найбільш важливих функцій. Обов'язковому перевизначенню підлягає функція OnDraw, необхідна будь-якому об'єкту класу, похідного від CView, для відображення інформації. Крім того, для будь-якого застосування, підтримуючого OLE (практично будь-якого сучасного застосування), необхідно перевизначити функцию-член IsSelected, що повертає значення TRUE, якщо об'єкт, на який указує передаваний нею аргумент, є виділеною ділянкою вікна поточного представлення. Якщо поточне виділення реалізоване за допомогою шаблону колекції CList як список об'єктів класу CDodtem (як було описано раніше), то реалізувати функцію IsSelected можна таким чином:

BOOL CSampView::IsSelected(const CObject* pDocItem) const

{

return (m_SelectList.Find((CDodtem *)pDodtem) != NULL);

}

Іншою важливою функцією-членом, перевизначуваною в більшості додатків, є функція OnUpdate. Функція-член UpdateAllViews класу документа викликає функцию-член OnUpdate для кожного представлення, що асоціюється з даним документом. Стандартна реалізація функції OnUpdate просто перемальовувала всю клієнтську область вікна представлення (що приводить до оновлення її зовнішнього вигляду). Проте, для поліпшення продуктивності додатку функцію OnUpdate можна перевизначити так, щоб перемальовувалися тільки ті області вікна представлення, які додаток повинен модифікувати. Наприклад, функцію OnUpdate можна реалізувати таким чином:

void CSampView::OnUpdate(CView *pView, LPARAM IHint, CObject *pObj)

{

if (lHint==UPDATE__OBJECT) // константа даного застосування

InvalidateRect((CAppObject *)pObj)->m_Recti;

Else Invalidate () ;

}

Зазвичай в самій функції-членові OnUpdate не доводиться нічого малювати, для цього застосовуються функції-члени OnDraw представлень.

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

Крім того, додаткам достатньо часто доводиться створювати контекст пристрою (DC — Device Context) тільки для того, щоб отримати поточне відображення вікна представлення. Наприклад, щоб дістати можливість перетворення значення POSITION (позиції) курсору миші при клацанні на ній з фізичних координат в логічні, усередині функції-члена OnLButtonDovm представлення застосовується наступний код:

void CSampView::OnLButtonDown(UITN nFlags, Cpoint point)

{

CClientDC dc(this);

OnPrepareDC(&dc);

dc.DPtoLP(Spoint) ; // подальша обробка

}

 

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

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

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


 

А также другие работы, которые могут Вас заинтересовать

16629. Разработка принципиально-технологической схемы производства детского питания 60.03 KB
  Отчёт По лабораторной работе № 1 Тема: Разработка принципиальнотехнологической схемы производства Цель работы Цель: Разработать принципиальную технологическую схему производства детского питания.Вариант №14 Ход работы: Ознакомиться с видами техн...
16630. Разработка технологии выполнения сварных соединений технологических трубопроводов 185.5 KB
  Лабораторная работа Разработка технологии выполнения сварных соединений технологических трубопроводов выбор способа сварки типа шва способа разделки кромок и их подготовки к сварке выбор способа сборки и фиксации кромок при сборке выбор сварочных материалов
16631. Изучение правил визуального и измерительного контроля и оформления операционных карт для выполнения контроля сварных изделий методом ВИК 3.44 MB
  Лабораторная работа Изучение правил визуального и измерительного контроля и оформления операционных карт для выполнения контроля сварных изделий методом ВИК Теоретические сведения 1. Назначение ВИК и документы в соответствии с которыми он должен выполняться ...
16632. Изучение правил радиографического контроля сварных соединений и применяемых для его выполнения материалов и принадлежностей 1.27 MB
  Лабораторная работа Изучение правил радиографического контроля сварных соединений и применяемых для его выполнения материалов и принадлежностей Теоретические сведения 1 Схема сущность и методы радиографического контроля Радиографический контро
16633. Изучение правил и выполнение маршрутной карты техпроцесса изготовления сварного изделия по одному из установленных ЕСТД способов их оформления 2.18 MB
  Лабораторная работа Изучение правил и выполнение маршрутной карты техпроцесса изготовления сварного изделия по одному из установленных ЕСТД способов их оформления Теоретические сведения 1 Документы устанавливающие необходимость и правила разработки технолог...
16634. Способы сборки и дуговой сварки стыковых соединений, снижающие опасность образования прожогов при выполнении навесу их корневого слоя 1.12 MB
  Лабораторная работа Способы сборки и дуговой сварки стыковых соединений снижающие опасность образования прожогов при выполнении навесу их корневого слоя 1 Общие сведения Навесу приходится выполнять стыковые сварные соединения в следующих случаях: при отсут
16635. Определение видов и размеров дефектов, которые не допускаются в сварных соединениях, выбор методов их контроля, последовательности и объемов контроля каждым методом 571.5 KB
  Лабораторная работа Определение видов и размеров дефектов которые не допускаются в сварных соединениях выбор методов их контроля последовательности и объемов контроля каждым методом Общие сведения Дефекты наличие которых в сварных соединениях не допускает
16636. Обзор возможностей Quantum GIS 3.96 MB
  Обзор возможностей Quantum GIS Цель работы: Получение практических навыков выполнения простейших операций в геоинформационной системе Quantum GIS. Ход работы Изучаю возможности геоинформационной системы Quantum GIS. Quantum GIS – это кроссплатформенная геоинформационная сист...
16637. Работа с векторными данными в Quantum GIS 1.11 MB
  Лабораторная работа №2 Работа с векторными данными Цель работы: Получение практических навыков создания и редактирования векторных данных в геоинформационной системе Quantum GIS. Ход работы Для создания плана территории БГТУ им. В.Г. Шухова воспользуемся сайтом h...