- •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)
Int cMainFrame::OnCreate(lpcreatestruct ipCreateStruct)
{ if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{ TRACEO("Failed to create toolbar\n"); return-1; //ошибка при создании
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
{ TRACEO("Failed to create status bar\n"); return-1; // ошибка при создании }
// TODO: Remove this if you don't want tool tips or a resizeable toolbar // Следующий код можно удалить для отмены установленных // стилей панели инструментов: // с отображением подсказок и с изменением размера m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // TODO: Delete these three lines if you don't want the toolbar to be dockable // Если следующий код удалить, то панель инструментов // не будет встраиваемой
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; }
BOOL CMainFrame::PreCreateWtodow(CREATESTRUCT& cs)
{ // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFrameWnd::PreCreateWindow(cs);
}
///////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef_DEBUG
void CMainFrame::AssertValid() const
{ CFrameWnd::AssertValid(); }
void CMainFrame::Dump(CDumpContext& dc) const
{ CFrameWnd::Dump(dc); }
#endif//_DEBUG
////////////////////////////////////////////////
Листинг заголовочного файла Appl.h:
#include "resource.h" // main symbols class CApplApp : public CWinApp
{ public:
CApplApp(); // Overrides (переопределяемые методы)
//ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CApplApp) public:
virtual BOOL Initlnstance(); //}}AFX_VIRTUAL // Implementation
//{{AFX_MSG(CApplApp) afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}>AFX_MSG DECLARE_MESSAGE_MAP()
};
Создание шаблона MDI-приложения
Создание шаблона MDI-приложения с использованием AppWizard аналогично созданию шаблона SDI-приложения. Поэтому рассмотрим только те особенности, которые присущи приложениям с многооконным интерфейсом.
На рис. 7.10 показано диалоговое окно, отражающее шестой шаг мастера приложений AppWizard. В этом окне приведен список создаваемых производных классов, их базовых классов и имена создаваемых заголовочных файлов и файлов реализации.
Рис. 7.10. Классы, создаваемые для шаблона MDI-приложения
Как видно из приведенного диалогового окна, для MDI-приложения дополнительно создается производный класс CChildFrame, наследуемый от базового класса CMDIChildWnd. Этот класс реализует окно-рамку, связываемое с документом и отображением. Главное окно-рамка реализуется классом CMainFrame.
Дело в том, что для SDI-приложений существует только одно окно-рамка и при открытии нового документа не создается никакого нового окна и нового объекта документа. Документ открывается в уже существующем окне, при этом происходит повторная инициализация объекта документа. Для приложений с многооконным интерфейсом при открытии нового документа шаблоном документа создается новое окно-рамка и новый объект документ.
Далее приводится автоматически созданный AppWizard программный код MDI-приложения (только отличный от кода для SDI-приложения) с некоторыми сокращениями и поясняющими комментариями.
Листинг файла Арр2.срр:
// Арр2.срр : Определение поведения приложения BEGIN_MESSAGE_MAP(CApp2App, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //...
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()
CApp2App::CApp2App() // Конструктор класса { // TODO: add construction code here
}
// Создание объекта приложения
CApp2App tbeApp;
BOOL CApp2App::InitInstance() // Переопределяемый метод инициализации
{
// Здесь расположен код, полностью идентичный, как и для SDI-приложения CMultiDocTemplate* pDocTemplate; // Создание шаблона документа pDocTempIate = new CMuItiDocTempIate(