MFC多视图共用一文档实现

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

    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;  
}

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

 

转载于:https://www.cnblogs.com/jshan/p/3281773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值