Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Программа, работающая с несколькими документами и видами
В нашей первой многодокументной (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; просмотров: 314. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |