TN025:文档、视图和帧创建

注释

自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。

此说明介绍了 WinApps、DocTemplates、Documents、Frames 和 Views 的创建和所有权问题。

WinApp

系统中有一个 CWinApp 对象。

它是由框架的内部实现 WinMain静态构造和初始化的。 必须派生自 CWinApp 执行任何有用的作(异常:MFC 扩展 DLL 不应具有 CWinApp 实例 — 初始化是改为执行的 DllMain )。

一个 CWinApp 对象拥有文档模板列表(a CPtrList)。 每个应用程序都有一个或多个文档模板。 DocTemplates 通常从资源文件(即字符串数组)加载。CWinApp::InitInstance

pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);

AddDocTemplate(pTemplate);

一个 CWinApp 对象拥有应用程序中的所有框架窗口。 应用程序的主框架窗口应存储在CWinApp::m_pMainWnd其中;如果尚未让 AppWizard 为你执行此作,通常可在实现中InitInstance设置m_pMainWnd。 对于单个文档界面(SDI),这是一个充当主应用程序框架窗口以及唯一 CFrameWnd 的文档框架窗口。 对于多个文档接口(MDI),这是一个 MDI-Frame(类 CMDIFrameWnd),充当包含所有子项 CFrameWnd的主应用程序框架窗口。 每个子窗口都是类 CMDIChildWnd (派生自 CFrameWnd),充当可能许多文档框架窗口之一。

DocTemplates

文档 CDocTemplate 的创建者和经理。 它拥有它创建的文档。 如果应用程序使用下面所述的基于资源的方法,则无需从中 CDocTemplate派生。

对于 SDI 应用程序,该类 CSingleDocTemplate 跟踪一个打开的文档。 对于 MDI 应用程序,该类 CMultiDocTemplate 保留从该模板创建的所有当前打开的文档的列表(a CPtrList)。 CDocTemplate::AddDocument 并提供 CDocTemplate::RemoveDocument 用于从模板添加或删除文档的虚拟成员函数。 CDocTemplate 是一个好友, CDocument 因此我们可以设置受保护的 CDocument::m_pDocTemplate 后退指针,以指向创建文档的文档模板。

CWinApp 处理默认 OnFileOpen 实现,这将反过来查询所有文档模板。 实现包括查找已打开的文档并确定打开新文档的格式。

CDocTemplate 管理文档和框架的 UI 绑定。

CDocTemplate 保留未命名文档数的计数。

CDocument

A CDocument 归 A CDocTemplate所有。

文档具有当前打开的视图(派生自 CView)的列表,用于查看文档(a CPtrList)。

文档不会创建/销毁视图,但它们在创建后相互附加。 当文档关闭(即通过文件/关闭)时,所有附加视图都将关闭。 关闭文档的最后一个视图(即窗口/关闭)时,文档将关闭。

RemoveView接口CDocument::AddView用于维护视图列表。 CDocument 是一个朋友, CView 因此我们可以设置 CView::m_pDocument 后退指针。

CFrameWnd

CFrameWnd 也称为框架)与 MFC 1.0 中的角色相同,但现在该 CFrameWnd 类设计为在许多情况下使用,而无需派生新类。 派生类 CMDIFrameWndCMDIChildWnd 并且也得到了增强,因此已实现许多标准命令。

负责 CFrameWnd 在框架的工作区中创建窗口。 通常有一个主窗口填充框架的工作区。

对于 MDI-Frame 窗口,工作区填充了 MDICLIENT 控件,而 MDICLIENT 控件又是所有 MDI-Child 框架窗口的父级。 对于 SDI-Frame 窗口或 MDI-Child 框架窗口,工作区通常填充一个 CView派生的窗口对象。 在这种情况下 CSplitterWnd,视图的工作区填充了 CSplitterWnd 窗口对象,并且 CView派生的窗口对象(每个拆分窗格一个)作为子窗口 CSplitterWnd创建。

另请参阅

按编号列出的技术说明
按类别列出的技术说明