MFC 10 - 是不是可以在 CView 中有一个 CFrameWnd?

Posted

技术标签:

【中文标题】MFC 10 - 是不是可以在 CView 中有一个 CFrameWnd?【英文标题】:MFC 10 - Is it possible to have a CFrameWnd within a CView?MFC 10 - 是否可以在 CView 中有一个 CFrameWnd? 【发布时间】:2011-04-18 06:13:13 【问题描述】:

我正在使用 MFC(是的,必须是 MFC,不,我不能与 .Net 互操作)来创建 CFrameWnd。

我的目标是创建一个包含 CFormView 的 CFrameWnd,它基于类似于以下内容的对话框模板:

我已经获得了要显示的框架和视图,并且那里有一个编辑控件。现在我想要的是让 CToolbar 与 Edit Text 控件的顶部对齐,但不停靠在顶部框架上。

理想情况下,我希望有一个可以动态添加的子框架/视图来代替语句组。这样我就可以正常停靠工具栏了。

我觉得奇怪的是,如果我在其中有一个拆分器,可以使用 CreateView 函数轻松实现这一点。我真的不想有一个分离器,觉得应该有另一种方式。

总之,这些是我需要帮助的问题:

Q1 - 如何在 CView 中拥有 CFrameWnd(就像 CSplitter::CreateView 所做的那样)? Q2 - 如何在 CView 中定位工具栏而不将其停靠或浮动在另一个框架中(我非常愿意调整大小,如果我知道如何手动定位它)?

现在我真的很感激 .Net 中的事情是多么简单。

【问题讨论】:

【参考方案1】:

我不建议在 CView 中粘贴 CFrameWnd。您将一直与 MFC 作斗争,基本上生活在一个 ASSERT 的世界中,因为消息路由等内部功能假定框架不在视图中。

而只是使用 CWnd 而不是 CFrameWnd 并在“创建”方法中手动创建工具栏和编辑 ctrl 和大小并自己定位它们(​​创建一个使用 CMFCToolbar::CalcFixedLayout 调整您的位置的 AdjustLayout 方法其他组件)。

Visual Studio 示例应用 PropertiesViewBar.cpp 就是一个很好的例子:

http://msdn.microsoft.com/en-us/library/bb983983(v=vs.90).aspx

注意:您可能需要重写 OnCmdMsg 以将消息路由扩展到内部控件。

【讨论】:

非常感谢。我没有看过样品,但它们非常好。从我们现有的代码出发,我走错了路。只是我还是文档对于哪种控件最适合特定任务有点含糊/含糊?我需要一个更好的策略来确定使用哪些控件。它在 .Net 中似乎更加直观。 是的,文档一点都不好。需要的是优秀的专业 MFC 书籍的更新版本,以涵盖新的功能包。我使用一个名为 FileLocator Pro 的产品来浏览 MFC 源和示例应用程序。

以上是关于MFC 10 - 是不是可以在 CView 中有一个 CFrameWnd?的主要内容,如果未能解决你的问题,请参考以下文章

MFC:从 CView 访问 m_wndToolBar?

MFC CView 进入 CDockablePane

CView::OnFilePrint 崩溃 MFC 应用程序

在 MFC 中如何从 CWinAppEx 访问 CView

MFC:调用 CView::OnInitalUpdate() 后调用哪个 CFrameWnd 函数?

如何在保持文档打开的同时关闭 MFC CVIEW