- •Implement_dyncreate(cApplView, cFormView)
- •Void cApplView::OnEndPrinting(cdc* /*pDc*/, cPrintlnfo* /*plnfo*/)
- •Void cApplView::OnPrint(cdc* pDc, cPrintlnfo*)
- •Implement_dyncreate(cMainFrame, cFrameWnd)
- •Int cMainFrame::OnCreate(lpcreatestruct ipCreateStruct)
- •Idr_app2type,
- •Int cMainFrame: :OnCreate(lpcreatestruct lpCreateStruct)
Idr_app2type,
RUNTIME_CLASS(CApp2Doc),
RUNTIME_CLASS(CChildFrame), // custom MDl child frame
RUNTIME_CLASS(CApp2View)); AddDocTempIate(pDocTemplate);
//создание главного окна-рамки MDI-приложения CMainFrame* pMain Frame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; mjMainWnd = pMainFrame;
// Далее расположен код разбора командной строки, как и для SDI-приложения
// Отображение и обновление главного окна-рамки
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
return TRUE; }
Листинг файла App2Doc.cpp:
// App2Doc.cpp : реализация класса CApp2Doc IMPLEMENT_DYNCREATE(CApp2Doc, CDocument)
BEGIN_MESSAGE_MAP(CApp2Doc, CDocument)
// ... END_MESSAGE_MAP()
CApp2Doc::CApp2Doc() // Конструктор
{ // TODO: add one-time construction code here
}
CApp2Doc::~CApp2Doc()
{}
BOOL CApp2Doc::OnNewDocument()
{ if (!CDocument::OnNewDocument()) return FALSE;
// TODO: add reinitialization code here return TRUE; }
void CApp2Doc::Serialize(CArchive& ar) { // Формируется код, как и для SDI-приложения }
Листинг файла MainFrm.cpp:
// MainFrm.cpp : реализация класса CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
ON_WM_CREATE() END_MESSAGE_MAP()
CMainFrame: :CMainFrame() // Конструктор
{ // TODO: add member initialization code here
}
CMainFrame:: ~CMainFrame()
{}
Int cMainFrame: :OnCreate(lpcreatestruct lpCreateStruct)
{ if(CMDIFrameWnd::OnCreate(lpCreateStruct) ==-1) return-1;
if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{ // ...
}
// Далее, как и для SDI-приложения
return 0; }
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { //....
return CMDIFrameWnd::PreCreateWindow(cs); }
Листинг файла ChildFrm.cpp:
// ChildFrm.cpp : реализация класса CChildFrame IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)
BEGIN_MESSAGE_MAP(CChUdFrame, CMDIChildWnd)
// ... END_MESSAGE_MAP()
CChildFrame::CChildFrame() // Конструктор { // TODO: add member initialization code here
}
CChildFrame::~CChildFrame() { }
BOOL CChiIdFrame::PreCreateWindow(CREATESTRUCT& cs)
{//...
return CMDIChildWnd::PreCreateWindow(cs);
}
Шаблон документа
Связь между классами приложения, окна-рамки, документа и отображения, а также используемый ресурс (в том числе и меню) устанавливается при создании шаблона документа. Шаблон документа определяет, как будет происходить создание новых документов. Более подробно классы шаблона документа были рассмотрены в предыдущей главе. В приведенном выше примере шаблон документа создается в методе Initlnstance класса САрр2Арр.
CMultiDocTemplate* pDocTemplate; // Создание шаблона документа pDocTemplate = new CMultiDocTemplate( IDR_APP2TYPE, RUNTIME_CLASS(CApp2Doc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CApp2View)); AddDocTemplate(pDocTemplate);
Данный шаблон документа содержит ссылки на структуры, описывающие следующие три класса: CApp2Doc, CChildFrame, CApp2View. Когда пользователь выполнит действия для создания нового файла или открытия существующего (пункт меню File|New или File|Open), приложение вызовет метод CreateObject и создаст три объекта, используя классы шаблона документа. Будут созданы объект документ, объект окна-рамка и объект отображение.
Приложение может иметь не один шаблон документа. Метод AddDocTemplate добавляет созданный шаблон к списку шаблонов документов приложения.
Идентификатор ресурса (в нашем примере IDR_APP2TYPE) играет связующую роль между всеми разрабатываемыми ресурсами, с помощью редакторов ресурсов, и окнами документов. Для того чтобы различные дочерние окна имели разные меню, клавиши-акселераторы или пиктограммы, они должны иметь при создание шаблона документа и различные идентификаторы ресурса. |
Новый идентификатор ресурса создается выполнением пункта меню View|Resource Symbols и щелчком в открывшемся диалоговом окне на командной кнопке New. Для каждого создаваемого вручную ресурса проекта следует также описать ресурсы, отображаемые в секциях вкладки Resources окна проекта. При этом идентификатор используемого в шаблоне документа ресурса во всех секциях вкладки Resources одинаков. При использовании нескольких шаблонов документа секции вкладки Resources будут содержать несколько идентификаторов ресурсов.