Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Программа, работающая с несколькими документами и видами




В нашей первой многодокументной (MDI) программе мы предоставляем в распоряжение пользователя главное окно, внутри которого могут находиться другие окна. Каждое из них соответствует некоторому документу, а каждый документ соответствует некоторому объекту документа в нашей программе (вскоре вы убедитесь, что Visual C++ берет на себя хлопоты по связыванию документов с создаваемыми объектами документов).

Каждый объект документа также обладает собственным объектом вида, поэтому нам не придется вносить глобальные изменения в пользовательский интерфейс Приложения. Например, мы можем точно так же получить от пользователя текст, сохранить его в объекте документа и затем отобразить в объекте вида. Обратите внимание: наша программа присваивает новому документу имя Multiv1 (она образует имя документа из имени программы, multiview).

ПОДСКАЗКА: Вы можете изменить стандартное имя, присваиваемое документу, — для этого следует нажать кнопку Advancedна этапе 4 работы с AppWizard и ввести в полеDoc Type Name имя, которое должно присваиваться документам в вашем приложении.

При выполнении команды File >- New программа открывает новое окно документа, Multiv2, в котором пользователь также может ввести текст (он никак не связан с текстом первого документа).

Пользователь может сохранить каждый документ на диске под любым именем, загрузить его независимо от остальных документов (предполагается, что в метод Serialize ()был добавлен соответствующий код). Таким образом, наше приложение становится многодокументным.     

Кроме того, для каждого документа можно создать несколько видов. Например, при редактировании Multiv2 пользователь может выбрать команду Window --> New Windowи создать для документа Multiv2 новый вид. Текст в заголовке первого вида Multiv2 изменится с Multiv2 на Multiv2:l, а в заголовке нового окна появится строка Multiv2:2. Это помогает различать виды одного документа.     

В следующем примере мы научимся создавать полосы прокрутки, чтобы пользователь мог просматривать в нескольких видах разные части одного документа.

Тем не менее, когда в одном виде вносятся изменения, необходимо проследить за тем, чтобы они появились также и в других видах того же документа.

На этот раз при создании программы multiviewустановите в первом окне AppWizard переключательMultiple documents. В результате AppWizard создает многодокументную (MDI) программу вместо однодокументной.

Чем многодокументная программа отличается от однодокументной?

MDI-программа во многих отношениях похожа на SDI-программу, поскольку для каждого нового документа автоматически создаются соответствующий объект (документа и сопровождающий его объект вида. Это означает, что для хранения и отображения данных можно просто предположить, что в программе имеется всего один документ и один вид, — с остальным справится Visual C++.

Как он автоматически учитывает все подробности? Если бы программа multiview была создана как однодокументная, то в файле приложения multiview.cpp присутствовал бы следующий код:

BOOL CMultiviewApp::InitInstance()

 {

AfxEnableControlContainer();

            CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CMultiviewDoc).

RUNTIME_CLASS(CMainFrame), // главное обрамленное окно SDI

RUNTIME_CLASS(CMultiviewView));

AddDocTemplate(pDocTemplate);

}

Обратите внимание — шаблон, используемый для создания новых документов, принадлежит к классу MFC CSingleDocTemplate. Программа заносит в него классы вида, документа и главного окна. Мы же создали multiview как многодокументную программу, поэтому файл multiview.cpp будет содержать следующий код:

BOOL CMultivlewApp::lnitlnstance()

 {

AfxEnableControlContainer();

CMultiDocTemplate* pDocTeniplate;

pDocTemplate = new CMultiDocTeniplate(

  IDR_MULTIVTYPE,   

  RUNTIME_CLASS(CMultlviewDoc),   

RUNTIME_CLASS(CChildFrame), //нестандартное обрамленное

                                                                  // дочернее окно MDI

                  RUNTIME_CLASS(CMultiviewView));

                           AddDocTemplate(pDocTemplate);

}

Для многодокументной программы используется шаблон CMultiDocTemplate, предназначенный для работы с несколькими документами, а мы связываем с этим шаблоном свои классы документа и вида, а также класс CChildFrame длядочерних окон — тех, которые отображаются внутри главного окна.   

Два типа окон, два типа меню     

Использование окон двух различных типов в многодокументных программах порождает интересную проблему. Во время работы с документом пользователь должен иметь доступ к определенным меню — File, Edit и т. д. Однако после того, как пользователь закроет все окна, меню Edit желательно убрать, поскольку редактировать уже нечего; возможно, при отсутствии открытых документов тоже потребуется убрать и другие меню или отдельные команды.

C++ позволяет справиться с ситуацией, определяя для программы два ресурса меню: IDR_MAINFRAME (для меню, отображаемого при отсутствии открытых документов) и IDR_MULTIVTYPE (для меню, отображаемого при одном или нескольких открытых документах). Считайте, что при наличии открытых документов второе меню заменяет главное меню программы. По умолчанию IDR_MAINFRAME состоит лишь из меню File, Viewи Help, тогда как в IDR_MULTIVTYPE присутствуют File, Edit, View,Window и Help.

ПОДСКАЗКА: При запуске программы в ней автоматически открывается новый документ. Меню IDR_MAINFRAME появляется лишь в том случае, если пользователь намеренно закроет все документы.

После краткого знакомства с устройством программы multiview мы добавим в нее код для чтения символов с клавиатуры.










Последнее изменение этой страницы: 2018-04-12; просмотров: 278.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...