注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍了 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
类设计为在许多情况下使用,而无需派生新类。 派生类 CMDIFrameWnd
, CMDIChildWnd
并且也得到了增强,因此已实现许多标准命令。
负责 CFrameWnd
在框架的工作区中创建窗口。 通常有一个主窗口填充框架的工作区。
对于 MDI-Frame 窗口,工作区填充了 MDICLIENT 控件,而 MDICLIENT 控件又是所有 MDI-Child 框架窗口的父级。 对于 SDI-Frame 窗口或 MDI-Child 框架窗口,工作区通常填充一个 CView
派生的窗口对象。 在这种情况下 CSplitterWnd
,视图的工作区填充了 CSplitterWnd
窗口对象,并且 CView
派生的窗口对象(每个拆分窗格一个)作为子窗口 CSplitterWnd
创建。