项目过程中有定制视图的需求,具体为打开程序默认双视图并且共用一个文档。在网上找了许多类似的资料,都不尽完善。本文直接从达到目的的角度叙述,实现原理不再多说。
1.在自己的App类中定义public变量
CMultiDocTemplate * m_pDocTemplate;
CMultiDocTemplate * m_pNewDocTemplate;
然后在App类中 Initlnstance找到RUNTIME_CLASS代码段,在之后加上
m_pNewDocTemplate=new CMultiDocTemplate(IDR_PracTrain_HotelTYPE, RUNTIME_CLASS(CPracTrain_HotelDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CPracTrain_HotelView)); AddDocTemplate(m_pNewDocTemplate);
其中各类名对应自己的工程中的类名。
2.在App类中重载OnFileNew
首先在头文件中定义afx_msg void OnFileNew();
然后修改消息映射ON_COMMAND(ID_FILE_NEW,OnFileNew)
最后在重载的函数中贴上代码
POSITION ps=m_pDocManager->GetFirstDocTemplatePosition(); CDocTemplate *pDocTemplate=m_pDocManager->GetNextDocTemplate(ps); pDocTemplate->OpenDocumentFile(NULL);
3.在Doc类中重载OnNewDocument
在Doc类中重载函数afx_msg CFrameWnd* EkCreateNewWindow( CDocTemplate* pTemplate,CDocument* pDocument )
在OnNewDocument中贴上
CPracTrain_HotelApp*p_app = (CPracTrain_HotelApp*)AfxGetApp(); EkCreateNewWindow(p_app->m_pNewDocTemplate, this );
在MainFrm.cpp末加上
CFrameWnd* CPracTrain_HotelDoc::EkCreateNewWindow( CDocTemplate* pTemplate,CDocument* pDocument ) { ASSERT_VALID( pTemplate ); ASSERT_VALID( pDocument ); CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, NULL ); CRect rect; GetClientRect(pFrame->m_hWnd,&rect); pFrame->MoveWindow(100,150,rect.Width(),rect.Height()); if( pFrame == NULL ) {TRACE0( "Warning: failed to create new frame. " ); return NULL; } ASSERT_KINDOF( CFrameWnd, pFrame ); pTemplate->InitialUpdateFrame( pFrame, pDocument ); return pFrame; }
编译完成就达到需求效果了。