Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скомпанованное пособие.docx
Скачиваний:
1
Добавлен:
07.05.2019
Размер:
3.3 Mб
Скачать

4.5 Создание приложения с многодокументным интерфейсом

Приложения с многодокументным интерфейсом MDI(Multiple Document Interface) позволяют пользователю работать одновременно с несколькими документами. Мастер приложений AppWizard создает остовы таких приложений автоматически. Однако эти остовы имеют два существенных недостатка: открываемые одновременно документы должны быть одного и того же типа и между ними почти отсутствует взаимодействие. Таким образом, MDI-приложения, остовы которых строит AppWizard, мало что дают в сравнении с SDI-приложениями и программисту, и пользователю.

Настоящий эффект MDI-приложения дает тогда, когда они поддерживают работу с несколькими типами документов, обеспечивая при этом между ними хорошее взаимодействие. Хорошим примером такого приложения является приложение, объединяющее текстовый редактор и словарь для одновременной работы с двумя типами документов: редактируемым текстом и словарем терминов с их определениями или переводом.

Каркас MDI-приложений таков, что он обеспечивает в процессе работы создание нескольких объектов-документов. За их создание отвечает специальный объектно-документный шаблон класса CMultiDocTemplate, который формируется с помощью метода InitInstance(), инициализирующего объект-приложение проекта. Кроме того, каркас создает два вида объектов, являющихся окнами-рамками: главное окно-рамка и окно-рамка документа, при этом Windows-окно, связанное с окном-рамкой документа является дочерним по отношению к Windows-окну, связанному с главным окном-рамкой.

Документный шаблон MDI-каркаса следующим образом управляет процессом создания новых документов:

BOOL CMdiApp::InitInstance()

{CMultiDocTemplate* pDocTemplate;

pDocTemplate=new CMultiDocTemplate

(IDR_MDITYPE,

RUNTIME_CLASS(CMdiDoc),

RUNTIME_CLASS(CChildFrame),

RUNTIME_CLASS(CMdiView)

);

AddDocTemplate(pDocTemplate);

CMainFrame* pCMainFrame=new CMainFrame;

If (!pCMainFrame->LoadFrame(IDR_MAINFRAME));

return FALSE;

M_pMainWnd= pMainFrame;

return TRUE;

}

Здесь RUN_TIME_CLASS является макросом, позволяющим по имени некоторого класса получить ссылку на специальную структуру типа CRunTimeClass, описывающую этот класс.

Идентификатор IDR_MDITYPE задает целый ряд ресурсов, связанных с документом, например, меню приложения.

Документный шаблон получает при своем создании описания трех классов:

а) класса документа CMdiDoc;

б) класса окна-рамки документа CСhildFrame;

в) класса облика CМdiView.

Все эти описания будет хранить созданный документный шаблон. При выборе пользователем команд New или Open главного меню каркас приложения, используя метод CreateObject и описания классов, имеющихся в документном шаблоне, создает объекты этих классов:

CRunTimeClass* pCRunTimeClass=RUNTIME_CLASS(CMdiDoc);

CObject* pObject= pRunTimeClass->CreateObject();

// Далее идут аналогичные операторы для CСhildFrame CМdiView.

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

Чтобы стать доступным каркасу, шаблон должен быть присоединен к списку документных шаблонов приложения с помощью метода CWinApp::AddDocTemplate. Для создания ещё одного варианта набора из документа, рамки и облика достаточно присоединить к списку документных шаблонов приложения ещё один шаблон с описаниями нужных классов.

Для приобретения необходимых навыков по разработке приложений с диалоговым интерфейсом следует выполнить задания 4.19 – 4.21 .