Compartir a través de


Documentos activos

Los documentos activos amplían la tecnología de documentos compuestos de OLE. Estas extensiones se proporcionan en forma de interfaces adicionales que administran vistas, de modo que los objetos pueden funcionar dentro de contenedores y, sin embargo, conservan el control sobre sus funciones de visualización e impresión. Este proceso permite mostrar documentos en marcos externos (como Microsoft Office Binder o Microsoft Internet Explorer) y en marcos nativos (como los puertos de vista propios del producto).

En esta sección se describen los requisitos funcionales de los documentos activos. El documento activo posee un conjunto de datos y tiene acceso al almacenamiento donde se pueden guardar y recuperar los datos. Puede crear y administrar una o varias vistas en sus datos. Además de admitir las interfaces de inserción y activación en contexto habituales de documentos OLE, el documento activo comunica su capacidad de crear vistas mediante IOleDocument. A través de esta interfaz, el contenedor puede solicitar la creación (y posiblemente la enumeración) de las vistas que el documento activo puede mostrar. A través de esta interfaz, el documento activo también puede proporcionar información varias sobre sí misma, como si admite varias vistas o rectángulos complejos.

A continuación se muestra la IOleDocument interfaz . Tenga en cuenta que la IEnumOleDocumentViews interfaz es un enumerador OLE estándar para IOleDocumentView* los tipos.

interface IOleDocument : IUnknown
    {
    HRESULT CreateView(
        [in] IOleInPlaceSite *pIPSite,
        [in] IStream *pstm,
        [in] DWORD dwReserved,
        [out] IOleDocumentView **ppView);

    HRESULT GetDocMiscStatus([out] DWORD *pdwStatus);

    HRESULT EnumViews(
        [out] IEnumOleDocumentViews **ppEnum,
        [out] IOleDocumentView **ppView);
    }

Cada documento activo debe tener un proveedor de marco de vista con esta interfaz. Si el documento no está incrustado en un contenedor, el propio servidor de documentos activo debe proporcionar el marco de vista. Sin embargo, cuando el documento activo está incrustado en un contenedor de documentos activo, el contenedor proporciona el marco de vista.

Un documento activo puede crear uno o varios tipos de vistas de sus datos (por ejemplo, normal, esquema, diseño de página, etc.). Las vistas actúan como filtros a través de los cuales se pueden ver los datos. Incluso si el documento solo tiene un tipo de vista, es posible que quiera admitir varias vistas como medio para admitir la nueva funcionalidad de ventana (por ejemplo, el elemento Nueva ventana en el menú Ventana en las aplicaciones de Office).

Requisitos para documentos activos

Un documento activo que se puede mostrar en un contenedor de documentos activo debe:

  • Utilice los archivos compuestos de OLE como su mecanismo de almacenamiento mediante la implementación de IPersistStorage.

  • Admite las características básicas de inserción de documentos OLE, incluido Create From File. Esto requiere las interfaces IPersistFile, IOleObjecty IDataObject.

  • Admitir una o varias vistas capaces de activarse en contexto. Es decir, las vistas deben admitir la interfaz IOleDocumentView así como las interfaces IOleInPlaceObject y IOleInPlaceActiveObject (mediante las interfaces IOleInPlaceSite y IOleInPlaceFrame del contenedor).

  • Admita las interfaces de documento activas estándar IOleDocument, IOleCommandTarget y IPrint.

El conocimiento de cuándo y cómo usar las interfaces del lado contenedor está implícito en estos requisitos.

Requisitos para ver objetos

Un documento activo puede crear una o varias vistas de sus datos. Funcionalmente, estas vistas son como puertos en un método determinado para mostrar los datos. Si un documento activo solo admite una sola vista, el documento activo y esa vista única se pueden implementar mediante una sola clase. IOleDocument::CreateView devuelve el puntero de interfaz del mismo objeto IOleDocumentView.

Para representarse dentro de un contenedor de documentos activo, un componente de vista debe admitir IOleInPlaceObject y IOleInPlaceActiveObject además de IOleDocumentView:

interface IOleDocumentView : IUnknown
    {
    HRESULT SetInPlaceSite([in] IOleInPlaceSite *pIPSite);
    HRESULT GetInPlaceSite([out] IOleInPlaceSite **ppIPSite);
    HRESULT GetDocument([out] IUnknown **ppunk);
    [input_sync] HRESULT SetRect([in] LPRECT prcView);
    HRESULT GetRect([in] LPRECT prcView);
    [input_sync] HRESULT SetRectComplex(
        [in] LPRECT prcView,
        [in] LPRECT prcHScroll,
        [in] LPRECT prcVScroll,
        [in] LPRECT prcSizeBox);
    HRESULT Show([in] BOOL fShow);
    HRESULT UIActivate([in] BOOL fUIActivate);
    HRESULT Open(void);
    HRESULT CloseView([in] DWORD dwReserved);
    HRESULT SaveViewState([in] IStream *pstm);
    HRESULT ApplyViewState([in] IStream *pstm);
    HRESULT Clone(
        [in] IOleInPlaceSite *pIPSiteNew,
        [out] IOleDocumentView **ppViewNew);
    }

Cada vista tiene un sitio de visualización asociado, que encapsula el marco de la vista y el puerto de visualización (HWND y un área rectangular en esa ventana). El sitio expone esta funcionalidad a través de la interfaz estándar IOleInPlaceSite . Tenga en cuenta que es posible tener más de un viewport en un único HWND.

Normalmente, cada tipo de vista tiene una representación impresa diferente. Por lo tanto, las vistas y los sitios de vista correspondientes deben implementar las interfaces de impresión IPrint e IContinueCallback, respectivamente. El marco de vista debe negociar con el proveedor de vista a través de IPrint cuando comienza la impresión, de modo que los encabezados, pies de página, márgenes y elementos relacionados se impriman correctamente. El proveedor de vistas notifica al marco eventos relacionados con la impresión por medio de IContinueCallback. Para obtener más información sobre el uso de estas interfaces, consulte Impresión mediante programación.

Tenga en cuenta que si un documento activo solo admite una sola vista, el documento activo y esa vista única se puede implementar mediante una sola clase concreta. IOleDocument::CreateView simplemente devuelve el mismo puntero de interfaz del IOleDocumentView objeto. En resumen, no es necesario que haya dos instancias de objeto independientes cuando solo se requiera una vista.

Un objeto view también puede ser un destino de comando. Al implementar IOleCommandTarget una vista puede recibir comandos que se originan en la interfaz de usuario del contenedor (por ejemplo, Nuevo, Abrir, Guardar como, Imprimir en el menú Archivo ; y Copiar, Pegar, Deshacer en el menú Editar ). Para obtener más información, consulte Control de mensajes y destinos de comandos.

Consulte también

Contención de documentos activos