Шаг 101 - Переводим SDI в MDI

Ну что, давайте сгенирируем приложение SDI с именем SDIMDI. Запускаем AppWizard сразу после выбора SDI жмем Finish. Готово, теперь пояснения. Я сделаю проект и Вы сможете его загрузить. Все изменения я буду коментировать вот так. Это на случай если в описании забуду или еще чего. Если Вы уже шаги делали, то понимаете о чем разговор :-)))

// ----- Comments SDI -------
.......
// ----- End Comments SDI ---

// ------ New MDI -----------
.....
// -----End New MDI ---------

Отличия MDI и SDI простые: MDI много окон, а в SDI одно окно. У нас пока окно одно. Надо много. Задача ясна.

Первое отличие это то, что у приложения MDI два меню. Первое меню имеет имя IDR_MAINFRAME и используется когда дочернии окна не открыты. Второе меню появляется когда открывается или появляется окно. Оно имеет имя типа IDR_ИМЯ_ПРОЕКТTYPE. Смотрите рисунок ниже.

101_1.gif (4087 b)

Раз такое дело, то и нам надо два меню. Давайте его создадим, имя его будет исходя из правил IDR_SDIMDITYPE. Идем в ресурсы и создаем. Только создаем не просто так. Наводим мышь на IDR_MAINFRAME и говорим Inset Copy. В поле Condition введите просто букву a. Появится копия. Потом вызовите свойства и дайте имя IDR_SDIMDITYPE, а из поля Condition удалите a. Теперь из IDR_MAINFRAME нужно удалить ненужные пункты меню.

SAVE
SAVE AS
PRINT
PRINT PRIVIEW
RESENT FILE
Лишнии разделительные линии
EDIT полностью
В принципе нам бы надо создать меню управления окнами, но черт с ним пока. Каждой строке меню нужен строковый ресурс. Вот теперь пойдите в строковые ресурсы скопируйте и вставьте IDR_MAINFRAME и переименуйте в IDR_SDIMDITYPE.

Теперь нужен еще и значок для окна. Он должен быть с тем же идентификатором. Создайте иконку с идентификатором IDR_SDIMDITYPE. Он у Вас вообще-то должен был появиться в виде DOC1. Посмотрите. Вот добрались и до кода. Первое - это нужно сменить класс рамки окна на CMDIFrameWnd.

//----- Comments SDI -------
//class CMainFrame : public CFrameWnd
//----- End Comments SDI ---
//------ New MDI -----------
class CMainFrame : public CMDIFrameWnd
// -----End New MDI ---------
CMainFrame() нужно сделать публичным. 

protected: // create from serialization only
//----- Comments SDI -------
//	CMainFrame();
//----- End Comments SDI ---
	DECLARE_DYNAMIC(CMainFrame)

// Attributes
public:
//------ New MDI -----------
	CMainFrame();
// -----End New MDI ---------
// Operations
Обратили внимание на DECLARE_DYNAMIC, а не так как в SDI. Теперь нам нужно изменить файл реализации, вот где.
//----- Comments SDI -------
//IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
//----- End Comments SDI ---
//------ New MDI -----------
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
// -----End New MDI ---------
Теперь нужно изменить создание шаблона.
	//----- Comments SDI -------
	//CSingleDocTemplate* pDocTemplate;
	//pDocTemplate = new CSingleDocTemplate(
	//IDR_MAINFRAME,
        //----- End Comments SDI ---
	//------ New MDI -----------
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(
	IDR_SDIMDITYPE,
        // -----End New MDI ---------
		RUNTIME_CLASS(CSDIMDIDoc),
		RUNTIME_CLASS(CMainFrame),       // main SDI frame window
		RUNTIME_CLASS(CSDIMDIView));
	AddDocTemplate(pDocTemplate);
Пора создавать класс рамки окна.
	// Parse command line for standard shell commands, DDE, file open
	//----- Comments SDI -------
	//CCommandLineInfo cmdInfo;
	//ParseCommandLine(cmdInfo);
	// Dispatch commands specified on the command line
	//if (!ProcessShellCommand(cmdInfo))
	//	return FALSE;
        //----- End Comments SDI ---
	//------ New MDI -----------
	CMainFrame* pMain = new CMainFrame;
	if (!pMain->LoadFrame(IDR_MAINFRAME))
		 return FALSE;
	m_pMainWnd=pMain;
	// -----End New MDI ---------
	// The one and only window has been initialized, so show and update it.
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();

	return TRUE;
Поменяем в шаблоне класс рамки окна
	//----- Comments SDI -------
	//	RUNTIME_CLASS(CMainFrame),       // main SDI frame window
	//----- End Comments SDI ---
	//------ New MDI -----------
		RUNTIME_CLASS(CChildFrame), 
       // -----End New MDI --------- 
Но у нас его нет !!! Создадим. Перейдите на вкладку ClassView, далее NewClass.

101_2.gif (4531 b)

И естественно, что этот класс нужно подключить в смысле заголовочного файла:

#include "SDIMDIDoc.h"
#include "SDIMDIView.h"
//------ New MDI -----------
#include "ChildFrame.h"
// -----End New MDI ---------

Всё вроде, проверяйте. Если не работает грузите проект.

Итак кратко.

Два меню, иконы, строковых ресурса.
Меняем класс рамки на MDI
Меняем шаблон на MDI
Меняем рамку шаблона с ChildMDI

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 08.02.2000