活动文档容器
活动文档容器(例如 Microsoft Office Binder 或 Internet Explorer)允许在单个框架内处理不同应用程序类型的多个文档(而不强制要求为每种文档类型创建和使用多个应用程序框架)。
MFC 为 COleDocObjectItem
类中的活动文档容器提供全面的支持。 可以使用 MFC 应用程序向导创建活动文档容器,方法是在 MFC 应用程序向导的“复合文档支持”页上选中“活动文档容器”复选框。 有关详细信息,请参阅创建活动文档容器应用程序。
有关活动文档容器的详细信息,请参阅:
容器要求
活动文档容器中的活动文档支持不仅意味着接口实现:它还要求具备使用被包含对象的接口的知识。 这同样适用于活动文档扩展,其中的容器还必须知道如何在活动文档本身上使用这些扩展接口。
集成活动文档的活动文档容器必须:
能够通过
IPersistStorage
接口处理对象存储,即,必须为每个活动文档提供一个IStorage
实例。支持 OLE 文档的基本嵌入功能,这需要提供实现
IOleClientSite
和IAdviseSink
的“站点”对象(每个文档或嵌入有一个此类对象)。支持嵌入对象或活动文档的就地激活。 容器的站点对象必须实现
IOleInPlaceSite
,容器的框架对象必须提供IOleInPlaceFrame
。通过实现
IOleDocumentSite
来支持活动文档的扩展,以提供容器与文档通信的机制。 容器可以选择性地实现活动文档接口IOleCommandTarget
和IContinueCallback
以获取简单的命令,例如打印或保存。
框架对象、视图对象和容器对象可以选择性地实现 IOleCommandTarget
以支持某些命令的调度,如命令目标中所述。 视图和容器对象还可以选择性地实现 IPrint
和 IContinueCallback
以支持编程打印,如编程打印中所述。
下图显示了容器及其组件(左侧)与活动文档及其视图(右侧)之间的概念关系。 活动文档管理存储和数据,视图显示或选择性地打印该数据。 以粗体显示的接口是活动文档参与操作所需的接口;以粗体和斜体显示的接口是可选接口。 所有其他接口都是必需的。
仅支持单一视图的文档可以在单个具体类上同时实现视图和文档组件(即它们的对应接口)。 此外,一次仅支持一个视图的容器站点可将文档站点和视图站点组合成单个具体站点类。 但是,容器的框架对象必须保持不同,此处之所以包含了容器的文档组件,目的仅仅是提供体系结构的完整画面;它不受活动文档包含体系结构的影响。
文档站点对象
在活动文档包含体系结构中,文档站点与 OLE 文档中的客户端站点对象相同,但添加了 IOleDocument
接口:
interface IOleDocumentSite : IUnknown
{
HRESULT ActivateMe(IOleDocumentView *pViewToActivate);
}
文档站点在概念上是一个或多个“视图站点”对象的容器。 每个视图站点对象与由文档站点管理的文档的单个视图对象相关联。 如果容器仅支持每个文档站点的单个视图,则它可以使用单个具体类来实现文档站点和视图站点。
视图站点对象
容器的视图站点对象管理特定文档视图的显示空间。 除了支持标准的 IOleInPlaceSite
接口外,视图站点通常还实现 IContinueCallback
以进行编程打印控制。 (请注意,视图对象永不查询 IContinueCallback
,因此它实际上可以在容器所需的任何对象上实现。)
支持多个视图的容器必须能够在文档站点中创建多个视图站点对象。 这将为每个视图提供单独的激活和停用服务,这些服务通过 IOleInPlaceSite
提供。
框选对象
在大多数情况下,容器的框架对象与用于在 OLE 文档中进行就地激活的框架(即处理菜单和工具栏协商的框架)相同。 视图对象可以通过 IOleInPlaceSite::GetWindowContext
访问此框架对象,该方法还提供对表示容器文档的容器对象的访问(可以处理窗格级工具栏协商和包含的对象枚举)。
活动文档容器可以通过添加 IOleCommandTarget
来扩充框架。 这样,它就可以接收源自活动文档用户界面的命令,就像此接口允许容器将相同的命令(例如“文件”菜单中的“新建”、“打开”、“另存为”、“打印”;“编辑”菜单中的“复制”、“粘贴”、“撤消”等)发送到活动文档一样。 有关详细信息,请参阅命令目标。