SDI 意思是“单Document界面”,它限制您一次只能查看一个文档,但不限制您可以为此文档打开的视图数量。
在 SDI 应用程序中打开多个视图的最常见方法可能是分光窗.
您将一个视图添加到CSingleDocTemplate
(哪一个并不重要)
pDocTemplate = new CSingleDocTemplate(
IDR_MYRESOURCEID,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMyFrameWnd),
RUNTIME_CLASS(CMyListView));
你的框架窗口得到一个实例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;
}
此示例创建一个具有一行和两列的分割窗口。拆分器的左侧是类型视图CMyListView
右侧是类型视图CMyEditView
.
您甚至可以将多个拆分器窗口相互嵌套,以在框架窗口中创建任意复杂的视图集合。
这是一个小教程,展示了如何在 SDI 应用程序中使用分割器窗口:
http://www.codeproject.com/KB/splitter/splitterwindowtutorial.aspx http://www.codeproject.com/KB/splitter/splitterwindowtutorial.aspx
Edit
MFC 在内部将添加到拆分器的视图与文档连接起来:CCreateContext* pContext
它被传递到OnCreateClient
包含参考m_pCurrentDoc
到当前文档(Framewindow 知道这个文档)。 MFC 在中使用它CView::OnCreate
(ViewCore.cpp) 将视图添加到文档中:m_pCurrentDoc->AddView(this)
并设置文档指针m_pDocument
在视图中。
因此后续的调用UpdateAllViews
您的文档将同时处理这两种视图。