带有 MDI 应用程序的 Childframe 中一个文档的多个视图
Multiple views for one document in Childframe with MDI Application
我有一个关于 MFC 应用程序的问题。
现在我正在维护遗留的 MFC 项目。而且有一个很大的问题。
我们没有为视图 class 使用文档 class。例如,有一个由 3 个视图组成的子框架。其中三个使用几乎相同的数据。但是每个视图都是自己获取数据而不是从文档中获取数据。所以有很多重复的代码。
我想解决这个问题并重构。所以我搜索了如何 link 在子框架中查看和记录。所有示例都是关于 CMultiDocTemplate 构造函数的。
以下是我尝试过的。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMFCApplication3View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(MyTreeView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
如果我像上面那样使用,它会询问您要显示哪一帧。这不是我想要的。这是一个不同的框架。
我想在同一个子框架中创建多个视图和一个文档。
而且我也试过这种方法。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
NULL);
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
视图为 NULL。并在子框架的 OnCreateClient()
中创建视图
BOOL CChildFrm::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_wndSplitter1.CreateStatic(this, 2, 1);
m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2);
m_wndSplitter3.CreateStatic(&m_wndSplitter2, 2, 1);
m_wndSplitter3.CreateView(1,0 , RUNTIME_CLASS(CTestView), CSize(200, 300), pContext);
m_wndSplitter3.CreateView(0,0 , RUNTIME_CLASS(CTestView2), CSize(200, 200), pContext);
}
它可以很好地创建多个视图。但是我不知道如何link CTestView,CTestView2 和一个文档。
当我在 TestView 中接近文档 class 时,我只能接近作为基础文档 class 的 CDocument。
我想处理特定文档,例如 CTestDocument。
有什么办法吗??如果有,请告诉我。
感谢阅读我的问题。
创建视图时,它所属的文档在 CCreateContext 中传递。
文档模板具有简单的功能CMultiDocTemplate::CreateNewFrame。使用此功能,您可以使用现有模板创建新的 frame/view 组合。
还有函数CFrameWnd::CreateView获取CCreateContext...
将 GetDocument( ) 成员添加到视图是 MFC 中的常见做法。
//.h
#ifndef _DEBUG
CTestDocument* GetDocument( ) { return dynamic_cast< CTestDocument* >( CView::GetDocument( ) ); }
#else
CTestDocument* GetDocument( );
#endif
//.cpp
#ifdef _DEBUG
CTestDocument* RaRichView::GetDocument( )
{
assert( dynamic_cast< CTestDocument* >( CView::GetDocument( ) ) );
return dynamic_cast< CTestDocument* >( CView::GetDocument( ) ); }
#endif
您需要将 CMFCApplication3Doc 更改为 CTestDocument,以便它是为您的框架打开的文档。
我有一个关于 MFC 应用程序的问题。 现在我正在维护遗留的 MFC 项目。而且有一个很大的问题。 我们没有为视图 class 使用文档 class。例如,有一个由 3 个视图组成的子框架。其中三个使用几乎相同的数据。但是每个视图都是自己获取数据而不是从文档中获取数据。所以有很多重复的代码。
我想解决这个问题并重构。所以我搜索了如何 link 在子框架中查看和记录。所有示例都是关于 CMultiDocTemplate 构造函数的。 以下是我尝试过的。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMFCApplication3View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(MyTreeView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
如果我像上面那样使用,它会询问您要显示哪一帧。这不是我想要的。这是一个不同的框架。
我想在同一个子框架中创建多个视图和一个文档。 而且我也试过这种方法。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE,
RUNTIME_CLASS(CMFCApplication3Doc),
RUNTIME_CLASS(CChildFrame),
NULL);
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
视图为 NULL。并在子框架的 OnCreateClient()
中创建视图BOOL CChildFrm::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_wndSplitter1.CreateStatic(this, 2, 1);
m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2);
m_wndSplitter3.CreateStatic(&m_wndSplitter2, 2, 1);
m_wndSplitter3.CreateView(1,0 , RUNTIME_CLASS(CTestView), CSize(200, 300), pContext);
m_wndSplitter3.CreateView(0,0 , RUNTIME_CLASS(CTestView2), CSize(200, 200), pContext);
}
它可以很好地创建多个视图。但是我不知道如何link CTestView,CTestView2 和一个文档。 当我在 TestView 中接近文档 class 时,我只能接近作为基础文档 class 的 CDocument。 我想处理特定文档,例如 CTestDocument。
有什么办法吗??如果有,请告诉我。
感谢阅读我的问题。
创建视图时,它所属的文档在 CCreateContext 中传递。
文档模板具有简单的功能CMultiDocTemplate::CreateNewFrame。使用此功能,您可以使用现有模板创建新的 frame/view 组合。
还有函数CFrameWnd::CreateView获取CCreateContext...
将 GetDocument( ) 成员添加到视图是 MFC 中的常见做法。
//.h
#ifndef _DEBUG
CTestDocument* GetDocument( ) { return dynamic_cast< CTestDocument* >( CView::GetDocument( ) ); }
#else
CTestDocument* GetDocument( );
#endif
//.cpp
#ifdef _DEBUG
CTestDocument* RaRichView::GetDocument( )
{
assert( dynamic_cast< CTestDocument* >( CView::GetDocument( ) ) );
return dynamic_cast< CTestDocument* >( CView::GetDocument( ) ); }
#endif
您需要将 CMFCApplication3Doc 更改为 CTestDocument,以便它是为您的框架打开的文档。