Аналіз функцій-членів класу 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) ; // подальша обробка

}