多个可互换视图 (MFC/C++)

Posted

技术标签:

【中文标题】多个可互换视图 (MFC/C++)【英文标题】:Multiple Interchangeable Views (MFC/C++) 【发布时间】:2008-10-13 15:27:37 【问题描述】:

我有一个带分离器的主机。在左边我有我的(想象地命名)CAppView_Left,在右边我有 CAppView_Right_1 和 CAppView_Right_2。通过以下代码,我正确初始化了两个主要视图:

if (!m_wndSplitter.CreateStatic(this, 1, 2))

    TRACE0("Failed to CreateStaticSplitter\n");
    return FALSE;

else 
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CAppView_Left), CSize(300, 200), pContext))

    TRACE0("Failed to create left pane\n");
    return FALSE;

else 
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CAppView_Right_1), CSize(375, 200), pContext))

    TRACE0("Failed to create first right pane\n");
    return FALSE;

...

我想做的是在右框架内创建第二个视图,但是当我尝试添加这个时:

if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CAppView_Right_2), CSize(375, 200), pContext))

    TRACE0("Failed to create first right pane\n");
    return FALSE;

VS 编译但无法运行应用程序,引发异常,告诉我我已经定义了视图。

有人可以建议我如何做到这一点吗?另外,如何在视图或文档类的视图之间进行切换?

【问题讨论】:

【参考方案1】:

有一篇 CodeProject 文章应该可以帮助你实现你想要的:

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

我之前已经替换了拆分器中的视图,所以如果上面没有帮助,我会发布一些我自己的代码。

【讨论】:

谢谢!我在 codeproject 上找到了其他示例,但没有一个像那样有效。非常感谢! :)【参考方案2】:

您无法创建第二个右手视图,因为您的

m_wndSplitter.CreateStatic(this, 1, 2) 

只创建了两列。您可以将其更改为

m_wndSplitter.CreateStatic(this, 1, 3)

并将您的第二个右视图更改为

if (!m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CAppView_Right_2), CSize(375, 200), pContext))
    
TRACE0("Failed to create first right pane\n");   
 return FALSE;

这会产生三列,每列都有一个单独的视图。您还可以创建一个额外的拆分器窗口来拆分现有视图之一,例如像

m_wndSplitter2.CreateStatic(m_View2, 2, 1)

m_view2 是您的第二个视图

【讨论】:

感谢您的输入 - 我不想创建三个窗格。我对我拥有的两个窗格感到满意,我只想能够在右侧窗格中使用两个不同的视图(可互换)。【参考方案3】:

要在视图之间切换,您需要在创建另一个视图之前显式删除视图。

如果您需要保留可互换视图的状态,您最好让视图能够从文档中初始化它们的状态。请小心使用需要在删除和重新创建其中一个视图之间停留的任何状态来更新文档。

【讨论】:

以上是关于多个可互换视图 (MFC/C++)的主要内容,如果未能解决你的问题,请参考以下文章

从 CDialog 派生的对话框在 DoModal (MFC/C++) 之后返回 -1

MFC/C#.NET混合模式本地化(多语言/多语言应用)

MFC C++/CLI 项目:VS2012 中的 /CLR 开关导致调试问题

在 MFC 中创建用于 WaitForSingle/MultipleObject 的 C# 句柄

我在哪里可以获得有关 ODBC 和 Access 数据库的高质量信息?

LNK2019:从 CPP 代码调用 C 函数