Contenedores de documentos activos
Un contenedor de documentos activo, como Microsoft Office Binder o Internet Explorer, le permite trabajar con varios documentos de diferentes tipos de aplicación dentro de un solo marco (en lugar de forzarle a crear y usar varios marcos de aplicación para cada tipo de documento).
MFC proporciona compatibilidad completa con contenedores de documentos activos de la clase COleDocObjectItem
. Puede usar el asistente para aplicaciones MFC para crear un contenedor de documentos activos; para ello, active la casilla Contenedor de documentos activos en la página Compatibilidad con documentos compuestos del asistente para aplicaciones MFC. Para más información, consulte Creación de una aplicación de contenedor de documentos activos.
Para más información sobre los contenedores de documentos activos, consulte:
Requisitos de contenedor
La compatibilidad con documentos activos de un contenedor de estos documentos implica algo más que solo implementaciones de interfaces: también requiere conocimientos sobre el uso de las interfaces de un objeto contenido. Lo mismo se aplica a las extensiones de los documentos activos, donde el contenedor también debe saber cómo usar esas interfaces de extensión en los propios documentos activos.
Un contenedor que integra documentos activos debe:
Ser capaz de controlar el almacenamiento de objetos mediante la interfaz
IPersistStorage
, es decir, debe proporcionar una instancia deIStorage
a cada documento activo.Admitir las características básicas de inserción de documentos OLE, para lo cual necesita objetos de "sitio" (uno por documento o inserción) que implementen
IOleClientSite
yIAdviseSink
.Admitir la activación en contexto de objetos insertados o documentos activos. Los objetos de sitio del contenedor deben implementar
IOleInPlaceSite
y el objeto del marco del contenedor debe proporcionarIOleInPlaceFrame
.Admitir las extensiones de los documentos activos mediante la implementación de
IOleDocumentSite
para proporcionar el mecanismo para que el contenedor se comunique con el documento. Opcionalmente, el contenedor puede implementar las interfacesIOleCommandTarget
yIContinueCallback
de los documentos activos para seleccionar comandos simples, como imprimir o guardar.
El objeto de marco, los objetos de vistas y el objeto de contenedor pueden implementar IOleCommandTarget
opcionalmente para que admita el envío de determinados comandos, como se analiza en Destinos de comando. Los objetos de vista y de contenedor también pueden implementar IPrint
y IContinueCallback
opcionalmente para admitir la impresión mediante programación, como se indica en Impresión mediante programación.
En la ilustración siguiente se muestran las relaciones conceptuales entre un contenedor y sus componentes (a la izquierda) y entre el documento activo y sus vistas (a la derecha). El documento activo administra el almacenamiento y los datos, y la vista muestra o imprime opcionalmente esos datos. Las interfaces en negrita son obligatorias para la participación de los documentos activos; las que están en negrita y en cursiva son opcionales. El resto de interfaces son obligatorias.
Un documento que solo admite una vista única puede implementar los componentes de vista y de documento (es decir, sus interfaces correspondientes) en una sola clase concreta. Además, un sitio de contenedor que solo admite una vista a la vez puede combinar el sitio de documento y el sitio de vista en una sola clase de sitio concreta. Sin embargo, el objeto de marco del contenedor debe ser distinto y el componente de documento del contenedor solo se incluye aquí para dar una imagen completa de la arquitectura; no se ve afectado por la arquitectura de contención de documentos activos.
Objetos de sitio de documentos
En la arquitectura de contención de documentos activos, un sitio de documento es lo mismo que un objeto de sitio cliente en documentos OLE con la adición de la interfaz IOleDocument
:
interface IOleDocumentSite : IUnknown
{
HRESULT ActivateMe(IOleDocumentView *pViewToActivate);
}
El sitio de documento es conceptualmente el contenedor de uno o varios objetos de "sitio de vista". Cada objeto de sitio de vista está asociado a objetos de vista individuales del documento administrado por el sitio del documento. Si el contenedor solo admite una vista única por sitio de documento, puede implementar el sitio de documento y el sitio de vista con una sola clase concreta.
Objetos de sitio de vistas
El objeto de sitio de vistas de un contenedor administra el espacio de visualización de una vista determinada de un documento. Además de admitir la interfaz estándar IOleInPlaceSite
, un sitio de vista también suele implementar IContinueCallback
para el control de impresión mediante programación. (Tenga en cuenta que el objeto de vista nunca consulta IContinueCallback
para que pueda implementarse realmente en cualquier objeto que desee el contenedor).
Un contenedor que admita varias vistas debe poder crear varios objetos de sitio de vistas dentro del sitio de documento. Esto proporciona a cada vista servicios de activación y desactivación independientes al igual que con IOleInPlaceSite
.
Objeto marco
El objeto de marco del contenedor es, en su mayor parte, el mismo marco que se usa para la activación en contexto en documentos OLE, es decir, el que controla la negociación de menús y barras de herramientas. Un objeto de vista tiene acceso a este objeto de marco mediante IOleInPlaceSite::GetWindowContext
, el cual también proporciona acceso al objeto de contenedor que representa el documento del contenedor (que puede controlar la negociación de la barra de herramientas en el nivel de panel y la enumeración de los objetos contenidos).
Un contenedor de documentos activos puede aumentar el marco mediante la adición de IOleCommandTarget
. Esto le permite recibir comandos que se originan en la interfaz de usuario del documento activo de la misma manera que esta interfaz puede permitir que un contenedor envíe los mismos comandos (por ejemplo Archivo, Nuevo, Abrir, Guardar como, Imprimir, Editar, Copiar, Pegar, Deshacer, etc.) en un documento activo. Para más información, consulte Destinos de comando.