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