Ну что, давайте сгенирируем приложение SDI с именем SDIMDI. Запускаем AppWizard сразу после выбора SDI жмем Finish. Готово, теперь пояснения. Я сделаю проект и Вы сможете его загрузить. Все изменения я буду коментировать вот так. Это на случай если в описании забуду или еще чего. Если Вы уже шаги делали, то понимаете о чем разговор :-)))
// ----- Comments SDI ------- ....... // ----- End Comments SDI --- // ------ New MDI ----------- ..... // -----End New MDI ---------
Отличия MDI и SDI простые: MDI много окон, а в SDI одно окно. У нас пока окно одно. Надо много. Задача ясна.
Первое отличие это то, что у приложения MDI два меню. Первое меню имеет имя IDR_MAINFRAME и используется когда дочернии окна не открыты. Второе меню появляется когда открывается или появляется окно. Оно имеет имя типа IDR_ИМЯ_ПРОЕКТTYPE. Смотрите рисунок ниже.
Раз такое дело, то и нам надо два меню. Давайте его создадим, имя его будет исходя из правил 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.
И естественно, что этот класс нужно подключить в смысле заголовочного файла:
#include "SDIMDIDoc.h" #include "SDIMDIView.h" //------ New MDI ----------- #include "ChildFrame.h" // -----End New MDI ---------
Всё вроде, проверяйте. Если не работает грузите проект.
Итак кратко.
Два меню, иконы, строковых ресурса. Меняем класс рамки на MDI Меняем шаблон на MDI Меняем рамку шаблона с ChildMDI