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). Якщо команда впливає лише на окреме представлення (наприклад зміна масштабу або кута повороту), то обробити команду повинен той, що піддається дії об'єкт представлення.


 

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

76135. Демокрит 38.52 KB
  Много путешествовал. Целью его странствий было знакомство с идеями мыслителей в далеких странах. Вне сомнения он посетил Персию Египет Вавилон и области вокруг Красного моря. Во время путешествий он заметно углубил свое образование в естествознании астрономии и особенно в математике.
76136. Основные положения норманнской и антинорманской теории 57.82 KB
  Однако кроме этой книги он является также автором другого издания Опыт новейшей истории о России которую рассматривал как продолжение Истории Российской В. Каковы основные тенденции развития Европы и России в XVII в.
76137. Безработица: сущность причины формы и последствия 30.04 KB
  Безработица это социальноэкономическое явление при котором часть трудоспособного населения не находит применения своему труду не получает работу причиной этого является превышение числа желающих найти работу над числом имеющихся рабочих мест.
76138. Элементы процесса управления. Функции управления 52.65 KB
  Актуальность темы контрольной работы состоит в том что эффективность управления определяется степенью взаимодействия сознательной управленческой деятельности с законами рыночной экономики. Цель работы: изучить вопросы определения менеджмента как вида деятельности его место в процессе управления.
76139. Несогласованность расчетов рассеивания в атмосфере вредных веществ и нормирование их концентрации 263.5 KB
  В 1951 г. в нашей стране были утверждены ПДК для 10 наиболее распространенных атмосферных загрязнителей. Это были первые в мире нормативы качества воздуха введенные работами проф. В.А. Рязанова и его последователей.
76140. WiFi технология беспроводной связи 180.5 KB
  Во всем мире стремительно растет потребность в беспроводных соединениях особенно в сфере бизнеса. Пользователи с беспроводным доступом к информации всегда и везде могут работать гораздо более производительно и эффективно чем их коллеги привязанные к проводным телефонным и компьютерным сетям.
76141. ДОПИНГ В СПОРТЕ И ЖИЗНИ 147.5 KB
  В настоящее время для профессионального спорта остро стоит проблема применения спортсменами допинга. Решение данной задачи сразу же влечёт за собой цепь сопутствующих вопросов: как совершенствовать систему допингконтроля какие препараты запретить к использованию...
76142. ОПРЕДЕЛЕНИЕ МОМЕНТОВ ИНЕРЦИИ ТВЕРДЫХ ТЕЛ МЕТОДОМ КРУТИЛЬНЫХ КОЛЕБАНИЙ 493.5 KB
  Если известен момент инерции тела относительно оси проходящей через центр масс то момент инерции тела относительно любой параллельной оси можно определить воспользовавшись теоремой Штейнера согласно которой момент инерции...
76143. Обонятельная ольфакторная сенсорная система 334.64 KB
  Сруктурно функциональная характеристика обонятельного анализатора. По волокнам обонятельного нерва импульсы поступают на обонятельную луковицу структуру переднего мозга в которой осуществляется обработка информации и далее следуют в корковый обонятельный центр.