没有文档/视图架构的 MFC

Posted

技术标签:

【中文标题】没有文档/视图架构的 MFC【英文标题】:MFC without document/view architecture 【发布时间】:2009-11-05 11:59:28 【问题描述】:

我想要一些关于在没有文档/视图架构的情况下使用 MFC 的帮助。

我创建了一个不支持 doc/view 的项目,Visual C++ 创建了一个 CFrameWnd 和一个继承自 CWnd 的视图。我将继承自 CWnd 的视图替换为继承自 CFormView 的新视图。

但是,当我运行我的程序时,在我关闭窗口后出现堆损坏错误。

【问题讨论】:

我不明白“从 CWnd 继承的视图和从 CFormView 继承的新视图”。 【参考方案1】:

如果在框架窗口处理 WM_CREATE 的地方,您更改代码以创建具有 AFX_IDW_PANE_FIRST 的“神奇”ID 的 CFormView 实例,您会发现它成为框架窗口的视图。这是由于 CFrameWnd::InitialUpdateFrame() 的行为所致,该行为将从 MFC 中调用。 MSDN 页面介绍了这个有用的小功能:

http://msdn.microsoft.com/en-us/library/ch3t7308.aspx

【讨论】:

【参考方案2】:

由于您想使用对话框编辑器而不想要文档/视图架构,那么您可能需要一个“基于对话框”的应用程序。

【讨论】:

【参考方案3】:

问题在于 MFC 的生命周期管理。视图声明(由 Visual C++ 向导创建)是:

CChildView        m_wndView;

我将上面的代码替换为:

CChildFormView    m_wndView;

CChildView 继承自 CWnd,CChildFormView 继承自 CFormView。两个视图都是由向导创建的,但只有 CChildFormView 使用 DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE 宏。

由于 m_wndView 是在堆栈中创建的,所以当 MFC 自动调用 delete 时,我得到了错误。

【讨论】:

我不明白将名称从 CChildView 更改为 CChildFormView 会如何改变应用程序的构建或执行方式,这些名称是我们提供的名称,而不是 MFC 类的名称。我怀疑这对其他人有任何意义。许多年前,我写了一篇文章,描述了如何在没有文档/视图架构的情况下创建 MFC CFormView 应用程序。这并不容易,至少当时不是。

以上是关于没有文档/视图架构的 MFC的主要内容,如果未能解决你的问题,请参考以下文章

MFC 中的文档视图体系结构

在文档/视图 MFC c++ 中没有视图的文档

MDI 应用程序 MFC 中文档的多个视图

如何在 MFC 应用程序首次启动时禁用自动文档/视图创建

mfc 单文档 多文档 对话框 区别

mfc中MDI模式下实现单文档多视图多窗口