Документи і представлення SDI
В основі додатків MFC лежить концепція об'єкту документа (document object) і відповідного йому вікна представлення (view window). Зазвичай документом є окремий файл, який додаток здатний відкрити. Такий файл містить набір даних, що обробляються додатком. Представлення (вигляд) забезпечує візуальне відображення даних документа, а також взаємодія з користувачем. Представлення здатне відображати дані застосування частково, оскільки їх може опинитися значно більше, чим можна розмістити на екрані; крім того, можливе застосування декількох різних представлень одного документа. Іншими словами, відносини між документами і представленнями будуються за принципом "один до многим"— тобто один документ може мати безліч уявлень, але кожне представлення може бути асоційоване тільки з одним документом.
Документами додатків є об'єкти відповідних класів, похідних від загального базового класу бібліотеки MFC CDocument. Всі класи вікон представлення походять від класу MFC CView. У цьому розділі розглядаються як самі класи CDocument і CView, так і їх застосування в додатках з однодокументным інтерфейсом (SDI— Single Document Interface). Складніші дії з документами і представленнями розглядаються в наступному розділі.
Застосування концепції документ/представлення
Всі створені за допомогою майстра AppWizard (майстри додатків) додатки MFC, що підтримують як одно-документный інтерфейс (SDI), так і багатодокументний інтерфейс (MDI— Multiple Document Interface), використовують архітектуру документ/представлення (document/view). Майстер AppWizard створює додаток так, щоб для кожного завантажуваного файлу в додатку створювався екземпляр відповідного класу документа. Крім того, в додатку обов'язково використовується екземпляр класу представлення, що надає користувачеві можливість взаємодіяти як з самим застосуванням, так і з даними документа.
У додатку з одним документом можна асоціювати декілька екземплярів певного представлення. Крім того, з одним і тим же документом може бути зв'язане декілька екземплярів різних уявлень.
У архітектурі документ/представлення прихована величезна потужність. Наприклад, в процесі роботи додаток створює в пам'яті (а згодом і знищує) копії файлу і керівника призначеним для користувача інтерфейсом (і даними) коди, що дозволяє в широких прибудовах маніпулювати відображенням даних, з якими працюють користувачі.
Що володіє дружнім інтерфейсом додаток забезпечує зазвичай декілька різних представлень одних і тих же даних, а це дозволяє краще зрозуміти їх сенс. Наприклад, на підставі табличних даних про температуру атмосфери на всій території США ймовірно буде досить важко зміркувати, наскільки холодно буде в штаті Південна Дакота. Але одного погляду на публіковану в газетах карту погоди, де синім кольором позначають холодний фронт, а оранжевим — теплий, цілком достатньо, щоб скласти представлення про те, яка погода може чекати мандрівника в цих краях. І це не дивлячись на те, що табличні дані містять ту ж інформацію. По-перше, представлення даних у вигляді таблиці дуже зручно для введення значень, а по-друге — це єдиний спосіб з'ясовувати погоду в штаті Південна Дакота для тих, хто не дуже добре знає, де саме вона знаходиться. Таблиця і кольорова карта — це два разных представлення, і додаток MDI може використовувати обидва (а можливо і ще декілька) для відображення одних і тих же даних.
Додатки з однодокументным інтерфейсом, створені за допомогою майстра AppWizard, здатні використовувати тільки один документ, один тип представлення і лише по одному екземпляру кожного з цих класів. Але це справедливо тільки для коди, створеної майстром AppWizard. Після того, як він закінчить роботу із створення додатку, розробник вольний на свій розсуд змінити конфігурацію проекту і, за бажання, скористатися декількома екземплярами будь-якого представлення або документа.
Додатки MDI використовують, принаймні, одну пару документ/представлення, але при необхідності можуть використовувати і декілька документів з різними представленнями в різних комбінаціях, що дозволяє користувачеві одночасно працювати з декількома файлами, а також відображати ці дані різними способами. Докладніша інформація про додатки MDI приведена в розділі 3, "Додатки MDI". На мал. 2.1 представлена схема взаємодії класів, використовуваних при реалізації простого додатку SDI із застосуванням класів MFC.
Ці класи послідовно розглядаються впродовж даного розділу. Наприклад, фреймові вікна (представлені на мал. 2.1 базовим класом CFrameWnd), детальніше розглядаються в розділі "Декілька слів про фреймові вікна". Проте, щоб легко зрозуміти деякі теми, викладені у ряді наступних розділів, з фреймовими вікнами має сенс ознайомитися зараз.
Фреймовим вікном (frame window) називають вікно, що містить представлення документа. Представлення (view) несе відповідальність за відображення на екрані вмісту документа, який користувач бачить фактично, а фреймом є батьківський (parent) елемент даного представлення. На справжній момент необхідно зрозуміти, що фрейм — це вікно, яке може володіти різними меню, панелями інструментів, рядком стану і заголовком вікна (а також, але необов'язково, системним меню і кнопками свернуть/развернуть). При зміні розміру вікна додатку SDI користувач фактично перетягує межу фрейма, а батьківському вікну передається відповідне повідомлення. Вікно представлення, оскільки воно є дочерним (child) вікном фрейма, також отримує ці повідомлення і змінює свої розміри відповідно до них.
У додатках SDI, створених майстром AppWizard, фреймові вікна реалізують за допомогою класу CMainFrame. Його початковий код міститься у файлах MainFrm. h і MainFrm. срр.
Мал. 2.1. Модель відносин між п'ятьма базовими класами додатку SDI
І нарешті, звернете увагу, що клас CMainFrame успадковує практично всі свої функціональні можливості від базового класу CFrameWnd, а у разі додатків SDI різниця між їх можливостями неістотна. Виняток становить можливість застосування і маніпулювання такими специфічними для дочірніх фреймових вікон елементами, як панелі інструментів і рядка стану. Взаємовідношення між рядками стану, панелями інструментів і фреймовими вікнами описані в розділі 6, "Рядок стану і панель інструментів".