Partilhar via


Documentos Ativos

Os documentos ativos estendem a tecnologia de documentos compostos do OLE. Essas extensões são fornecidas na forma de interfaces adicionais que gerenciam exibições, para que os objetos possam funcionar dentro de contêineres e ainda manter o controle sobre suas funções de exibição e impressão. Esse processo possibilita a exibição de documentos tanto em quadros estrangeiros (como o Microsoft Office Binder ou o Microsoft Internet Explorer) quanto em quadros nativos (como as portas de exibição do próprio produto).

Esta seção descreve os requisitos funcionais para documentos ativos. O documento ativo possui um conjunto de dados e tem acesso ao armazenamento onde os dados podem ser salvos e recuperados. Ele pode criar e gerenciar uma ou mais visualizações em seus dados. Além de suportar as habituais interfaces de incorporação e ativação in-loco de documentos OLE, o documento ativo comunica a sua capacidade de criar vistas através de IOleDocument. Através dessa interface, o contêiner pode pedir para criar (e possivelmente enumerar) as exibições que o documento ativo pode exibir. Através dessa interface, o documento ativo também pode fornecer informações diversas sobre si mesmo, como se ele suporta várias visualizações ou retângulos complexos.

A seguir está a IOleDocument interface. Observe que a IEnumOleDocumentViews interface é um enumerador OLE padrão para IOleDocumentView* 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);
    }

Todo documento ativo deve ter um provedor de quadro de exibição com essa interface. Se o documento não estiver incorporado em um contêiner, o próprio servidor de documentos ativo deverá fornecer o quadro de exibição. No entanto, quando o documento ativo é incorporado em um contêiner de documento ativo, o contêiner fornece o quadro de exibição.

Um documento ativo pode criar um ou mais tipos de exibições de seus dados (por exemplo, normal, estrutura de tópicos, layout de página e assim por diante). As visualizações funcionam como filtros através dos quais os dados podem ser vistos. Mesmo que o documento tenha apenas um tipo de vista, poderá continuar a pretender suportar várias vistas como meio de suportar a nova funcionalidade de janela (por exemplo, o item Nova Janela no menu Janela em aplicações do Office).

Requisitos para documentos ativos

Um documento ativo que pode ser exibido em um contêiner de documento ativo deve:

  • Use os Ficheiros Compostos do OLE como o seu mecanismo de armazenamento ao implementar IPersistStorage.

  • Ofereça suporte aos recursos básicos de incorporação de documentos OLE, incluindo Criar a partir do arquivo. Isso requer as interfaces IPersistFile, IOleObjecte IDataObject.

  • Suporte para uma ou mais visualizações, cada uma das quais é capaz de ativação no local. Ou seja, as visualizações devem suportar a interface IOleDocumentView, bem como as interfaces IOleInPlaceObject e IOleInPlaceActiveObject (usando as interfaces do contentor IOleInPlaceSite e IOleInPlaceFrame).

  • Suporta as interfaces IOleDocumentde documentos ativos padrão , IOleCommandTargete IPrint.

O conhecimento de quando e como usar as interfaces do lado do contêiner está implícito nesses requisitos.

Requisitos para exibir objetos

Um documento ativo pode criar uma ou mais exibições de seus dados. Funcionalmente, essas exibições são como portas para um método específico para exibir os dados. Se um documento ativo suportar apenas uma única exibição, o documento ativo e essa exibição única poderão ser implementados usando uma única classe. IOleDocument::CreateView Retorna o ponteiro de interface do mesmo IOleDocumentView objeto.

Para ser representado em um contêiner de documento ativo, um componente de exibição deve suportar IOleInPlaceObject e IOleInPlaceActiveObject além 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 visualização tem um site de visualização associado, que encapsula a moldura de visualização e a porta de visualização (HWND e uma área retangular nessa janela). O site expõe essa funcionalidade através da interface padrão IOleInPlaceSite . Observe que é possível ter mais de uma porta de exibição em um único HWND.

Normalmente, cada tipo de vista tem uma representação impressa diferente. Portanto, as visualizações e os sites de exibição correspondentes devem implementar as interfaces de impressão se IPrint e IContinueCallback, respectivamente. O quadro de exibição deve negociar com o provedor de exibição quando a impressão começar por meio de IPrint, para que cabeçalhos, rodapés, margens e elementos relacionados sejam impressos corretamente. O provedor de exibição notifica o quadro de eventos relacionados à impressão por meio do IContinueCallback. Para obter mais informações sobre o uso dessas interfaces, consulte Impressão programática.

Observe que, se um documento ativo oferecer suporte apenas a uma única exibição, o documento ativo e essa exibição única poderão ser implementados usando uma única classe concreta. IOleDocument::CreateView retorna simplesmente o ponteiro da interface do mesmo objeto IOleDocumentView. Em resumo, não é necessário que haja duas instâncias de objeto separadas quando apenas uma exibição é necessária.

Um objeto de vista também pode ser um destino de comando. Ao implementar IOleCommandTarget uma vista pode receber comandos que se originam na interface do utilizador do contentor (como Novo, Abrir, Salvar Como, Imprimir no menu Arquivo; e Copiar, Colar, Desfazer no menu Editar). Para obter mais informações, consulte Tratamento de mensagens e destinos de comando.

Ver também

Contenção ativa de documentos