您的位置:首页 > 其它

MFC多视图共用一文档实现

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

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


编译完成就达到需求效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: