Gra*_*amS 5 c++ model-view-controller mfc visual-studio
如何说服MFC Doc/View架构让我同时显示同一文档的两个不同视图?
例如,假设我的CDocument子类代表一些描述的存档.
我想要一个UI,其中该存档中所有条目的名称显示在CListView左侧窗格的子类中,而当前所选条目的详细信息显示在CEditView右侧窗格的子类中.
在CSingleDocTemplate似乎只允许连接了一个文件,一个框架和一个视图.我仍然想要一个SDI应用程序,但我想要一个文档和两个不同的视图 - 这不是一个好的Doc/View架构的重点吗?
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您的文档将处理两种视图.