具有MDI应用程序的Childframe中的一个文档的多个视图

时间:2016-09-21 05:13:40

标签: view mfc mdi doc

我对MFC应用程序有疑问。 现在我正在维护传统的MFC项目。而且存在一个巨大的问题。 我们没有为视图类使用文档类。例如,有一个由3个视图组成的子框架。其中三个使用几乎相同的数据。但是每个视图本身都不是从文档中获取数据。所以有很多重复的代码。

我想解决这个并重构。所以我搜索了如何在子框架中链接视图和文档。所有样本都是关于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);
}

它可以很好地创建多个视图。但我不知道如何链接CTestView,CTestView2和一个文件。 当我在TestView中接近文档类时,我只能接近基础文档类的CDocument。 我想接近像CTestDocument这样的特定文档。

有什么办法吗?如果有,请告诉我。

感谢您阅读我的问题。

2 个答案:

答案 0 :(得分:1)

创建视图时,它所属的文档将在CCreateContext中传递。

文档模板具有简单的函数CMultiDocTemplate :: CreateNewFrame。使用此功能,您可以使用现有模板创建新的框架/视图组合。

还有CFrameWnd :: CreateView函数采用CCreateContext ...

答案 1 :(得分:0)

在MFC中常见的做法是向视图添加GetDocument()成员。

ctrl-Z

您需要使用CTestDocument更改CMFCApplication3Doc,以便为您的框架打开文档。