同时显示同一文档的多个视图

Gra*_*amS 5 c++ model-view-controller mfc visual-studio

如何说服MFC Doc/View架构让我同时显示同一文档的两个不同视图?

例如,假设我的CDocument子类代表一些描述的存档.
我想要一个UI,其中该存档中所有条目的名称显示在CListView左侧窗格的子类中,而当前所选条目的详细信息显示在CEditView右侧窗格的子类中.

CSingleDocTemplate似乎只允许连接了一个文件,一个框架和一个视图.我仍然想要一个SDI应用程序,但我想要一个文档和两个不同的视图 - 这不是一个好的Doc/View架构的重点吗?

Sla*_*uma 7

SDI表示"单个文档界面",它一次只能限制一个文档,但不能限制您可以为此文档打开的视图数量.

在SDI应用程序中打开多个视图的最常见方法是Splitter Windows.

你添加一个视图CSingleDocTemplate(哪一个没关系)

pDocTemplate = new CSingleDocTemplate(
    IDR_MYRESOURCEID,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CMyFrameWnd),
    RUNTIME_CLASS(CMyListView));
Run Code Online (Sandbox Code Playgroud)

您的框架窗口获取a的实例,CSplitterWnd m_wndSplitter并重载OnCreateClient虚函数:

BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    VERIFY(m_wndSplitter.CreateStatic(this,1,2)); // one row / two columns

    VERIFY(m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyListView),
        CSize(300,300),pContext));
    VERIFY(m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyEditView),
        CSize(300,300),pContext));

    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

此示例创建一个包含一行和两列的拆分器窗口.在分离器的左侧是类型视图,CMyListView在右侧是类型视图CMyEditView.

您甚至可以将多个拆分器窗口彼此嵌套,以在框架窗口中创建任意复杂的视图集合.

这是一个小教程,展示了如何在SDI应用程序中使用拆分器窗口:

http://www.codeproject.com/KB/splitter/splitterwindowtutorial.aspx

编辑

使用文档添加到拆分器中的视图的连接在内部执行MFC:CCreateContext* pContext传入的视图OnCreateClient包含m_pCurrentDoc对当前文档的引用(Framewindow知道此文档).MFC在CView::OnCreate(ViewCore.cpp)中使用它将View添加到Document:m_pCurrentDoc->AddView(this)m_pDocument在View中设置文档指针.

因此,随后调用UpdateAllViews您的文档将处理两种视图.