首页 > 技术文章 > MFC多视图共用一文档实现

jshan 2013-08-26 01:18 原文

    项目过程中有定制视图的需求,具体为打开程序默认双视图并且共用一个文档。在网上找了许多类似的资料,都不尽完善。本文直接从达到目的的角度叙述,实现原理不再多说。

    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.\n" );   
    return NULL;   
    }   
    ASSERT_KINDOF( CFrameWnd, pFrame );   
    pTemplate->InitialUpdateFrame( pFrame, pDocument );   

    return pFrame;  
}

编译完成就达到需求效果了。

 

推荐阅读