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


 

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

84075. Терморегуляция, виды терморегуляции 31.19 KB
  Различают несколько механизмов отдачи тепла в окружающую среду. Излучение – отдача тепла в виде электромагнитных волн инфракрасного диапазона. Количество тепла рассеиваемого организмом в окружающую среду излучением пропорционально площади поверхности излучения площади поверхности тела не покрытой одеждой и градиенту температуры. При температуре окружающей среды 20с и относительной влажности воздуха 40–60 организм взрослого человека рассеивает путём излучения около 40–50 всего отдаваемого тепла.
84076. Терморегуляция у детей младшего возраста 31.18 KB
  Температура тела ребенка в первые месяцы жизни не вполне постоянна. Она может изменяться под влиянием различных факторов: охлаждения или перегревания тела приема пищи крика и так далее. Так у новорожденных на 1 кг массы тела приходится 700 см2 кожи у десятилетних детей 425 см2 а у взрослых 220 см2. Накопление тепла в организме способствует повышению температуры тела.
84077. Предмет и задачи анатомии и физиологии, предмет и задачи возрастной анатомии и физиологии 29.86 KB
  Физиология – наука о функциях живого организма как единого целого о процессах протекающих в нём и механизмах его деятельности. В настоящее время физиология и анатомия накопили огромный фактический материал. Это привело к тому что от физиологии и от анатомии отпочковываются две самостоятельные науки – это возрастная анатомия и возрастная физиология. Возрастная физиология – это наука которая изучает особенности процесса жизнедеятельности организма на разных этапах онтогенеза.
84078. Современные методы изучения организма. Клетка, строение животной клетки 33.92 KB
  Клетка строение животной клетки. Масса и длина тела окружность грудной клетки и талии обхват плеча и голени толщина кожножировой складки – все это и многое другое традиционно измеряют антропологи с помощью медицинских весов ростомера антропометра и других специальных приспособлений. В каждой клетке различают две основные части цитоплазму и ядро в цитоплазме в свою очередь содержатся органоиды мельчайшие структуры клетки обеспечивающие ее жизнедеятельность митохондрии рибосомы клеточный центр и др. В ядре перед делением...
84079. Ткани, органы и системы органов 30.93 KB
  Особенностью соединительной ткани является сильное развитие межклеточного вещества. К соединительной ткани относятся кровь лимфа хрящевая костная жировая ткани. Благодаря сокращению скелетных мышц становится возможным передвижение тела в пространстве; особое строение сердечной мышечной ткани обеспечивает одновременное сокращение больших участков сердечной мышцы. Структурной единицей нервной ткани является нервная клетка нейрон состоящий из тела овальной звездчатой или многоугольной формы и отходящих от него отростков.
84080. Общие принципы регуляции работы организма 22.35 KB
  Регуляция в живых организмах представляет собой совокупность процессов обеспечивающих необходимые режимы функционирования достижение определенных целей или полезных для организма приспособительных результатов. Процесс физиологической регуляции является основой самоудовлетворения потребностей живого организма.
84081. Эндокринная система, эндокринные железы и функции основных гормонов 31.16 KB
  Железа внутренней секреции производит гландулярные гормоны к которым относятся все стероидные гормоны гормоны щитовидной железы и многие пептидные гормоны. Диффузная эндокринная система представлена рассеянными по всему организму эндокринными клетками продуцирующими гормоны называемые агландулярными за исключением кальцитриола пептиды. Гормоны органические соединения вырабатываемые определенными клетками и предназначенные для управления функциями организма их регуляции и координации. Гормоны биологические активные вещества...
84082. Нервная система, принципы нервной регуляции 46.5 KB
  Нервная система – одна из важнейших систем, которая обеспечивает координацию и регуляцию протекающих в организме процессов и устанавливает взаимосвязь с внешней средой. Изучает ее работу – неврология.
84083. Скелет. Функции костной системы. Особенности строения костей и их соединений 74.95 KB
  Особенности строения костей и их соединений. Скелет это комплекс костей различных по форме и величине. У человека более 200 костей 85 парных и 36 непарных которые в зависимости от формы и функции делятся на: трубчатые кости конечностей; губчатые выполняют в основном защитную и опорную функции ребра грудина позвонки и др. Эластичность упругость костей зависит от наличия в них органических веществ а твердость обеспечивается минеральными солями.