69286

Керування документами та представленнями

Лекция

Информатика, кибернетика и программирование

Оскільки архітектура документ/представлення є наріжним каменем будь-якого документ - орієнтованого застосування (як вже було сказано, діалогові застосування потрійні трохи інакше, чим додатки архітектури документ/представлення), класи MFC повинні володіти здатністю створювати...

Украинкский

2014-10-02

47.5 KB

0 чел.

Лекція № 6

Тема: Керування документами та представленнями

План

  1.  Документи та представлення
  2.  Фреймові вікна
  3.  Ресурси шаблону документу

Керування документами і представленнями

Оскільки архітектура документ/представлення є наріжним каменем будь-якого документ - орієнтованого застосування (як вже було сказано, діалогові застосування потрійні трохи інакше, чим додатки архітектури документ/представлення), класи MFC повинні володіти здатністю створювати і видаляти об'єкти класів, що реалізовують архітектуру документ/представлення. У зв'язку з тим, що додаток здатний забезпечувати декілька типів взаємин документ/представлення, класи MFC повинні володіти можливістю з'ясовувати, які саме класи документа, представлення і відображення використовуються, які відносини між цими класами, а також, як створювати об'єкти цих класів під час виконання програми. Не дивлячись на те, що один документ може підтримувати декілька різних типів представлень, цілком можлива ситуація, коли асоціація інших представлень з даним документом може виявитися безглуздою.

Створивши проект додатку SDI, можна відмітити, що у функцию-член Initlnstance об'єкту додатку майстер АррWizard додає код створення шаблону документа. Цей код може виглядати подібно до приведеного нижче (ім'я додатку — SDIApp):

BOOL CSDIAppApp::Initlnstance () {

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate{

IDR_MAINFRAME

RUNTIME_CLASS(CSDIAppDoc)

RUNTIME_CLASS(CMainFrame) // головне фреймове вікно SDI

RUNTIME_CLASS(CSDIAppView)

);

AddDocTemplate(pDocTemplate);

Отже, розглянемо, що саме робить даний код. Після розміщення в стеку покажчика на клас CSingleDocTemplate здійснюється виклик конструктора класу, якому передається чотири параметри. Перший параметр — це ідентифікатор ресурсу. Докладніша інформація про ідентифікатори ресурсів приводиться далі в цьому розділі. Другим, третім і четвертим параметрами конструктора класу CSingleDocTemplate є покажчики на інформацію про класи часу виконання (runtime class information). Макрокоманда RUNTIME_CLASS створює покажчик на інформацію про класи часу виконання для певного класу. В даному випадку такий підхід використовується для доступу до інформації про класи документа, головного вікна і представлення додатку. Це зроблено для того, щоб клас CSingleDocTemplate міг динамічно створити ці об'єкти і сформувати таким чином повний комплект, необхідний для забезпечення архітектури документ/представлення.

Об'єкт CSingleDocTemplate існує впродовж всього періоду виконання додатку. Класи MFC використовують його як контейнер, а при завершенні роботи додатку (і видаленні об'єкту CWinApp) всі шаблони документа, додані в цей об'єкт, також будуть видалені. У складі функції CWinApp: : Initlnstance знаходиться фрагмент коди, яка розміщує в пам'яті екземпляр класу CSingleDocTemplate даного застосування (CWinApp), а наявність коди, що видаляє об'єкти шаблону документа, можна уникнути, якщо використовувати для їх створення шаблон AddDocTemplate. Це пов'язано з тим, що функція-деструкція CWinApp автоматично видалить все, що було розміщене в пам'яті шаблоном документа.

 

Фреймові вікна

Про взаємодію документів і фреймів вже згадувалося, тепер розглянемо цю тему детально. Не дивлячись на те, що безпосередньо з класами фреймів доводиться працювати не так часто, як з класами документів і представлень, читач, ймовірно, вже усвідомив, наскільки важливе правильне розуміння ролі фреймів в додатку з архітектурою документ/представлення.

Фактично, представлення реалізовані в додатку у вигляді вікон, але не контекстних або фреймових, а у вигляді дочірніх вікон, що не мають ні рамок, ні власних меню. Таким чином, ці вікна повинні знаходитися усередині спеціальних фреймових вікон. Класи MFC розташовують вікно представлення в клієнтській області (client area) фреймового вікна, вказаного в конструкторі шаблону документа. У додатку SDI фреймове вікно завжди є головним вікном (main window) додатку. Представлення, що містять, фреймові вікна додатків багатодокументного інтерфейсу є дочірніми вікнами (child window).

При розробці додатків Windows більшість програмістів не роблять ніяких додатковий дій, щоб відокремити клієнтську область додатку від фреймового вікна. Замість цього зазвичай створюють вікно в стилі WS_OVERLAPPED і працюють прямо в його клієнтській області. Для розділення завдань класів MFC, корпорація Microsoft реалізувала їх так, щоб існувало два різних типи фреймових вікон, які можна використовувати залежно від обставин, тобто в бібліотеці MFC фреймові вікна SDI відрізняються від фреймових вікон MDI як внутрішньо, так і зовні. Докладніша інформація про фреймові вікна приводиться далі, а поки досить зрозуміти, що саме фреймове вікно отримує всі повідомлення від меню і рамок вікон.

Повідомлення рамок вікна (window frame message) отримують лише ті вікна, які володіють рамками. Такі повідомлення містять інформацію про зміну розмірів вікна, його розгортання, згортанні і так далі Крім того, фреймове вікно отримує достатньо багато повідомлень з областей, що не відносяться до клієнтської, оскільки фреймове вікно несе відповідальність за реалізацію і неклієнтській області (nonclient area) вікна додатку.

Ресурси шаблону документа

Першим параметром конструктора класу CSingleDocTemplate є ідентифікатор ресурсу (resource ID). Подібні ідентифікатори застосовуються для вказівки ресурсів, використовуваних для вкомплектовування фрейма таблицею акселераторів (accelerator table), меню, піктограмою і панеллю інструментів, в чому легко переконатися, створивши в середовищі розробки простий додаток SDI і відкривши панель Resource View (Ресурси) середовища розробки. У цій панелі всі вищезгадані типи ресурсів будуть відображені з однаковим ідентифікатором IDR_MAINFRAME. Не дивлячись на те, що зовсім необов'язково використовувати встановлене за умовчанням значення IDR_MAINFRAME, застосування, що розробляється, повинно використовувати однаковий ідентифікатор для кожного з типів ресурсу, що асоціюється з фреймовим вікном додатку. Такий підхід був задуманий і реалізований в бібліотеці MFC спеціально: застосування єдиного ідентифікатора дозволяє передати конструктору класу CSingleDocTemplate один параметр, а не цілий набір параметрів (але одному на кожен тип ресурсу).

Рядкові ресурси і шаблон документа

Рядковий ресурс (string resource) — колекція рядків, що зберігається у файлі ресурсу. Це якнайкращий спосіб зберігання рядкових значень додатку. По можливості, завжди використовуйте саме його, замість жорсткого завдання рядків в коді самого додатку. Такий підхід істотно підвищує гнучкість додатку, а також спрощує його подальший супровід. Один з цих рядків критично важливий для архітектури документ/представлення і повинна мати той же ідентифікатор, що і переданий в конструктор класу CSingleDocTemplate. Фактично, вона складена з семи підрядків, розділених символом нового рядка (\n). Підрядки є набором параметрів, що встановлюють тип документа додатку. Наприклад, такий рядок, типовий для додатку SDI, є в додатку SDIApp.

STRINGTABLE

BEGIN

IDR_MAINFRAME

"SDIApp\n\nSDIApp\n\n\nSDIApp.Document\nSDIApp.Document"

END

Ресурси представлення

Більшість решти ресурсів додатку вказана в шаблоні документа за допомогою ідентифікатора ресурсу (resource ID). Ці ресурси асоціюються з тим типом документа, з яким працює дане застосування. У створених майстром AppWizard додатках SDI для всіх ресурсів встановленого за умовчанням шаблону документа використовується ідентифікатор ресурсу на ім'я IDR_МАINFRAME.

Майстер AppWizard комплектує головне фреймове вікно додатку відповідним меню, яке також має ідентифікатор IDR_MAINFRAME; Це означає, що в додатках однодокументного інтерфейсу вид меню залежатиме від типу активного документа, а в додатках багатодокументного інтерфейсу кожен окремий тип документа матиме свій власний вид меню. Якщо необхідно, щоб для всіх типів документа використовувалося однакове меню, досить вказати в шаблоні кожного типу посилання на один і той же ресурс меню.

Фрейм містить піктограму, яка нарівні з рештою всіх ресурсів володіє тим же самим ідентифікатором. Ця піктограма представляє даний додаток SDI. Наприклад, вищезгадану піктограму операційна система відображає на кнопці панелі завдань, коли додаток буде згорнутий. У додатку багатодокументного інтерфейсу дана піктограма застосовується для згорнутих дочірніх вікон MDI, а піктограма, використовувана для всього застосування, знаходиться в іншому ресурсі.

Додаток може відображати діалогове вікно, назване так само, як і ідентифікатор ресурсу шаблону. Такі застосування достатньо рідкісні; зазвичай додатки використовують діалогове вікно як основу інтерфейсу представлення документа. Далі в розділі розглядаються представлення що використовують діалогове вікно як основу свого інтерфейсу. Даний розділ достатньо важливий, оскільки більшість демонстраційних додатків цієї книги використовують подібний інтерфейс.

Додаток може містити растрові ресурси (bitmap resource), які майстер AppWizard використовує для створення стандартної панелі інструментів фреймового вікна. Не дивлячись на те, що панель інструментів складається з окремих кнопок, самі малюнки на кнопках фактично є фрагментами єдиного зображення. Докладніша інформація про клас CToolbar, використовуваний в бібліотеці MFC для створення панелі інструментів, приводиться в розділі 6, "Рядок стану і панель інструментів".

Оскільки фрейм реалізує вікно, що містить меню, він повинен також підтримувати таблицю акселераторів (accelerator table). Таблиця забезпечує взаємозв'язок між натиснутими клавішами акселератора (комбінаціями клавіш) і повідомленнями WM COMMAND, які додаток повинен посилати у тому випадку, коли операційна система виявляє натиснуті клавіші. Середовище виконання сама поклопочеться про пошук таблиці акселераторів, а також про передачу і диспетчеризацію повідомлень, які операційна система формує у відповідь на натиснення користувачем відповідної клавіші. Стандартна таблиця акселераторів, що створюється майстром AppWizard, містить акселератори (вони ж комбінації клавіш) стандартних елементів призначеного для користувача інтерфейсу і меню.

Будь-яким з цих ресурсів можна відредагувати так, щоб він відповідав потребам даного застосування. Але для досягнення необхідної мети внесення змін тільки в ресурси може опинитися недостатньо. Тому, перш ніж вносити зміни до ресурсів, упевніться, що добре розумієте роботу класів, що використовують їх, щоб додаток залишився працездатним.


 

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

30633. Евангельские мотивы в романе М. А. Булгакова «Мастер и Маргарита» 15.42 KB
  Евангельские истории художественно преображены Булгаковым в главах представляющих собою роман в романе произведение мастера о Понтии Пилате и Иешуа ГаНоцри. Многие из них измененные имена Нового и Ветхого Завета: Иешуа Понтий Пилат Иуда Марк Аврелий Кот Бегемот имеет параллель своего имени в Библии Азазелло падший ангел в Ветхом завете.Свобода и несвобода в философском аспекте поставлена в спорах Иешуа и ГаНоцри с могущественным римским прокуратором Понтием Пилатом в душе которого происходит борьба человеческого и...
30634. Какова роль евангельского сюжета о воскрешении Лазаря в понимании идеи романа Ф.М. Достоевского «Преступление и наказание» 12.72 KB
  В центре Преступления и наказания помещен эпизод чтения XI главы Евангелия от Иоанна о воскрешении Лазаря.Образ воскресения Раскольникова действительно связан с евангельским повествованием о воскрешении Лазаря Христом которое читает Раскольникову Соня. Сама же Соня при чтении мысленно сравнивает его с иудеями присутствовавшими при совершении неслыханного чуда воскрешения уже смердящего Лазаря и уверовавшими во Христа.
30635. Женские образы и судьбы в русской классической литературе 16.26 KB
  Только в русской литературе обращается так много внимания на изображение внутреннего мира и сложных переживаний женской души. Ее любовь к русскому народу к патриархальной старине к русской природе проходит через все произведение. Все эти черты воспитала в ней связь с русским народом и русской природой создавшими поистине русскую женщину человека большой душевной красоты.
30636. Земное и вечное в стихотворении А.А. Ахматовой «Приморский сонет» 15.8 KB
  Ахматовой Приморский сонет.Облик героини поэзии Ахматовой предстает в житейской простоте но в нем заключается пафос сильной личности. Ее лирическая героиня не отражает персональной судьбы Ахматовой а отражает проявление женской доли женского голоса. Предметный мир воспринимается уже в ином виде: три ступеньки кажутся вечностью любимый прием Ахматовой оксюморон темный дом свечи горевшие равнодушножелтым огнем.
30637. Изображение народного характера в рассказе А.И. Солженицына «Матренин двор» 12.62 KB
  Солженицына является то что он исследует русский характер. Но главным в образе героини является доброта доброе расположение духа добрая улыбка побеждающая в душе все тяготы и заботы. Неслучайно Солженицын хотел назвать свой рассказ Не стоит село без праведника поскольку именно Матрена является истинным праведником: она тот самый праведник без которого не стоит село. Реалистическая достоверность изображенных событий накладывает особый отпечаток на образ Матрены ее жизнь является не только символом праведности но и ощутимым...
30638. Интерьер как средство характеристики героя 18.61 KB
  Интерьер его домика состоящего из шести крошечных комнат говорит о том что перед нами маленький человек очевидно небогатый который не претендует на значимость любит уют. И действительно толстоногий стол заваленный почерневшими от старинной пыли бумагами говорит о том что Василий Иванович занимается работой но делает это время от времени. О том что Василий Иванович интересуется естественными науками и физическими опытами говорит сломанная электрическая машина но это увлечение осталось в прошлом так как она до сих...
30639. «Испытание любовью» как средство характеристики героя в произведениях отечественной классики 19 века 14.36 KB
  Но можем сказать что испытание любовью открыло насколько изменился Онегин.Ещё одним героем прошедшим через испытание любовью является Печорин Лермонтова Герой нашего времени. В таких случаях жизнь мстит за себя: в крепости Печорин пытается заглушить тоску сердца любовью к дикарке Бэле но очень скоро убеждается в бесплодности своих усилий.
30640. Стихотворение М.Ю. Лермонтова «Родина». (Восприятие, истолкование, оценка.) 15.68 KB
  Лермонтова Родина. Ни в одном произведении Лермонтов не достигал такой поэтической ясности как в стихотворении Родина написанном в 1841 году. Родина отразила целый комплекс народных понятий и представлений сложившихся на протяжении столетий и выявившихся как разум народа в отличие от предрассудков предубеждений мгновенного настроения толпы или тех чувств которые несли на себе печать векового рабства и порабощения. И как богат этот опыт как он многосторонен как утонченно и благородно народное чувство и как велик его разум...
30641. Любовная лирика А.С. Пушкина. Чтение наизусть и анализ одного из стихотворений по выбору учащегося 13.5 KB
  Пушкина. Любовь в поэзии Пушкина это глубокое нравственно чистое и самоотверженное чувство облагораживающее и очищающее человека. Я помню чудное мгновенье одно из самых проникновенных трепетных гармонических стихотворений Пушкина относящихся к любовной тематике. Вновь возрождение чувств в душе поэта вновь прилив жизненных сил вновь приход творческого вдохновения: Душе настало пробужденье: И вот опять явилась ты В этом стихотворении Пушкина любовная тема сочетается с философскими раздумьями поэта о своей жизни о радости...