文档/视图体系结构的替代项

MFC 应用程序通常使用文档/视图体系结构来管理用户的信息、文件格式和数据的可视表示形式。 对于大多数桌面应用程序,文档/视图体系结构是一种适当的高效应用程序体系结构。 此体系结构将数据与查看分开,在大多数情况下,可以简化应用程序并减少冗余代码。

但是,文档/视图体系结构不适用于某些情况。 请考虑下列示例:

  • 如果您要移植用C语言编写的Windows平台应用程序,建议在向应用程序添加文档/视图支持之前先完成移植工作。

  • 如果要编写轻型实用工具,你可能会发现可以在不使用文档/视图体系结构的情况下执行此作。

  • 如果您的原始代码已经将数据管理与数据查看混合在一起,那么将代码移到文档/视图模型的工作就不值得,因为必须将数据管理和数据查看分开。 你可能希望按原样保留代码。

若要创建不使用文档/视图体系结构的应用程序,请清除 MFC 应用程序向导步骤 1 中的 “文档/视图体系结构支持 ”复选框。 有关详细信息,请参阅 MFC 应用程序向导

注释

MFC 应用程序向导生成的基于对话框的应用程序不使用文档/视图体系结构,因此,如果选择对话框应用程序类型,将禁用 文档/视图体系结构支持 复选框。

Visual C++ 向导、源代码和对话框编辑器都可以与生成的应用程序配合使用,就像与其他向导生成的应用程序配合使用一样。 应用程序可以支持工具栏、滚动条和状态栏,并具有“ 关于 ”框。 应用程序不会注册任何文档模板,并且不包含文档类。

请注意,生成的应用程序具有派生自CChildView的视图类CWnd。 MFC 在应用程序创建的框架窗口中创建并放置视图类的一个实例。 MFC 仍使用视图窗口强制实施,因为它简化了应用程序内容的定位和管理。 你可以将绘制代码添加到此类的 OnPaint 成员中。 代码应向视图添加滚动条,而不是向框架添加滚动条。

由于 MFC 提供的文档/视图体系结构负责实现应用程序的许多基本功能,因此项目中缺少文档/视图体系结构意味着你负责实现应用程序的许多重要功能:

  • 如 MFC 应用程序向导提供,应用程序的菜单仅包含“文件”菜单上的“新建”和“退出”命令。 (仅 MDI 应用程序支持 命令,不支持没有文档/视图支持的 SDI 应用程序。生成的菜单资源将不支持 MRU(最近使用)列表。

  • 必须为应用程序支持的任何命令添加处理程序函数和实现,包括“文件”菜单上的“打开”和“保存”。 MFC 通常提供代码来支持这些功能,但该支持严格绑定到文档/视图体系结构。

  • 应用程序的工具栏(如果您请求一个)将会最小化。

强烈建议使用 MFC 应用程序向导创建没有文档/视图体系结构的应用程序,因为该向导保证正确的 MFC 体系结构。 但是,如果必须避免使用向导,以下是在代码中绕过文档/视图体系结构的几种方法:

  • 将文档视为未使用的追加,并在视图类中实现数据管理代码,如上所述。 文档的开销相对较低。 单个 CDocument 对象本身会产生少量的开销,加上CDocument的基类 CCmdTargetCObject 的小开销。 后面两个类都很小。

    CDocument中声明:

    • 两个 CString 对象。

    • 三个 BOOL。

    • 一个 CDocTemplate 指针。

    • 一个 CPtrList 对象,其中包含文档视图的列表。

    此外,文档需要创建文档对象、其视图对象、框架窗口和文档模板对象所需的时间。

  • 将文档和视图视为未使用的追加项。 将数据管理和绘图代码放在框架窗口中,而不是视图。 此方法更接近 C 语言编程语言模型。

  • 重写创建文档和视图的 MFC 框架部分,以便不再需要创建它们。 文档创建过程从调用 CWinApp::AddDocTemplate开始。 从应用程序类的 InitInstance 成员函数中消除该调用,而在 InitInstance 中创建一个框架窗口。 将数据管理代码置于框架窗口类中。 文档/视图创建过程在 文档/视图创建中演示。 这是更多的工作,需要更深入地了解框架,但它可以让你完全摆脱文档/视图的负担。

MFC:在数据库应用程序中使用无文档和视图的数据库类提供了文档/视图替代项的更具体示例。

另请参阅

文档/视图体系结构