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


 

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

13983. Певица Аврил Лавин 516.3 KB
  Выполнила ученица 8 класса А средней школы №50 Исаева Мария Певица Аврил Лавин настоящее имя Avril Ramona Lavign родилась в Певица Аврил Лавин настоящее имя Avril Ramona Lavign родилась в сентябре 27 числа 1984 года. Кроме нее в семье еще ...
13984. Pitbull. Armando Christian Perez 254.93 KB
  Доклад По музыке На тему: Pitbull. Подоготовил ученик 7 В класса. Бекиров Руслан Доклад по музыке на тему: Pitpul Armando Christian Perez Певец музыкальный продюсер автор песен. Сценическое имя: Pitbull.Начало карьеры: 2003 год.День рождения: 15 января 1...
13985. Теодор Адорно как теоретик социологии музыки 40 KB
  Эссе на тему:Теодор Адорно как теоретик социологии музыки Сущность общества становится сущностью музыки Теодор Адорно Человек и музыка Неразрывные понятия ведь без человека нет музыки а без музыки нет человека. И я не преувеличиваю. Подумайте: с древне...
13986. Глинка Михаил Иванович 29.91 KB
  Глинка Михаил Иванович Глинка Михаил Иванович 18041857 русский композитор. Первые музыкальные впечатления Глинки связаны с народной песней. Ещё в детстве приобщился к профессиональной музыке. Юные годы Глинки прошли в Петербурге. Благотворно отразились на формирован
13987. Теория и методика музыкального воспитания детей дошкольного возраста 786.25 KB
  Гогоберидзе А.Г. Теория и методика музыкального воспитания детей дошкольного возраста: Учеб. пособие для студ. высш. учеб. заведений /А. Г. Гогоберидзе В.А.Деркунская. М.: Издательский центр Академия 2005. 320 с. Оглавление ОТ АВТОРОВ Часть 1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ МУЗЫК...
13988. Урок. Как выбрать правильную гитару 73.5 KB
  Как выбрать правильную гитару У вас есть желание купить себе качественную гитару На первый взгляд это не проблема. Бытует мнение что тот у кого толстый бумажник имеет огромные преимущества. Узнавая все новые тонкости и мелочи в процессе выбора гитары самодовольн...
13989. Обзор музыкальной жизни Франции 19 века. Берлиоз. Франк 45 KB
  Лекция двенадцатая. Тема: Обзор музыкальной жизни Франции 19 века. Берлиоз. Франк. Начало 19 века. Первая половина. Главный жанр опера. В конце 17 века основан театр в Париже. В 30е годы складывается жанр большая опера. Джакомо Мейербер. Оперы: Робертдьявол Г
13990. История музыкальной культуры. Конспект лекций 1.32 MB
  Музыкальная культура Древнего мира История музыки это наука так как по методу она связана с логикой исторического процесса. Каждое музыкальное явление рассматривается ею в пространстве и во времени. Лишь с этих позиций мы можем объективно оценить значимость творчес
13991. Древнерусская музыкальная культура 40 KB
  3 Древнерусская музыкальная культура Развивалась она прежде всего как вокальная музыка. Истоки ее в народной русской песне. В народной песне отражалась вся жизнь народа труд быт вера и т.д.. Из самых древних песен известны колыбельные календарные песни...