gpt4 book ai didi

c++ - 显示同一文档的多个同时 View

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:50 26 4
gpt4 key购买 nike

我如何说服 MFC Doc/View 体系结构让我同时显示同一文档的两个不同 View ?

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

CSingleDocTemplate 似乎只允许连接一个文档、一个框架和一个 View 。我仍然想要一个 SDI 应用程序,但我想要一个文档和两个不同的 View - 这难道不是一个好的 Doc/View 架构的全部意义所在吗?

最佳答案

SDI 的意思是“单一文档界面”,它限制您一次只能访问一个文档,但不限制您可以打开该文档的 View 数。

在 SDI 应用程序中打开多个 View 的最常见方法可能是拆分窗口

您向 CSingleDocTemplate 添加一个 View (哪一个并不重要)

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 类型的 View ,右侧是 CMyEditView 类型的 View 。

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

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

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

编辑

将您添加到拆分器的 View 与文档连接起来在内部执行 MFC:CCreateContext* pContext 传递到 OnCreateClient 包含一个引用 m_pCurrentDoc 到当前文档(框架窗口知道这个文档)。 MFC 在 CView::OnCreate (ViewCore.cpp) 中使用它来将 View 添加到文档:m_pCurrentDoc->AddView(this) 并设置文档指针 m_pDocument 在 View 中。

因此,后续调用文档的 UpdateAllViews 将处理这两个 View 。

关于c++ - 显示同一文档的多个同时 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5584444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com