Contêineres de documento ativos
Um contêiner de documento ativo, como o Microsoft Office Binder ou o Internet Explorer, permite que você trabalhe com vários documentos de diferentes tipos de aplicativo em um único quadro (em vez de forçar você a criar e usar vários quadros de aplicativo para cada tipo de documento).
O MFC fornece suporte total para contêineres de documentos ativos na classe COleDocObjectItem
. Você pode usar o Assistente de Aplicativo MFC para criar um contêiner de documento ativo marcando a caixa de seleção Contêiner de documento ativo na página Suporte ao documento composto do Assistente de Aplicativo MFC. Para obter mais informações, consulte Criando um aplicativo de contêiner de documentos ativo.
Para obter mais informações sobre contêineres de documentos ativos, consulte:
Requisitos de contêiner
O suporte a documentos ativos em um contêiner de documento ativo significa mais do que apenas implementações de interface: ele também requer conhecimento do uso das interfaces de um objeto contido. O mesmo se aplica a extensões de documento ativas, em que o contêiner também deve saber como usar essas interfaces de extensão nos próprios documentos ativos.
Um contêiner de documento ativo que integra documentos ativos deve:
Seja capaz de lidar com o armazenamento de objetos por meio da interface
IPersistStorage
, ou seja, ele deve fornecer uma instânciaIStorage
para cada documento ativo.Suporte aos recursos básicos de inserção de documentos OLE, exigindo objetos "site" (um por documento ou inserção) que implementam
IOleClientSite
eIAdviseSink
.Suporte à ativação in-loco de objetos inseridos ou documentos ativos. Os objetos do site do contêiner devem implementar
IOleInPlaceSite
, e o objeto de quadro do contêiner deve fornecerIOleInPlaceFrame
.Dê suporte às extensões dos documentos ativos implementando
IOleDocumentSite
para fornecer o mecanismo para que o contêiner fale com o documento. Opcionalmente, o contêiner pode implementar as interfaces de documento ativasIOleCommandTarget
eIContinueCallback
para escolher comandos simples, como imprimir ou salvar.
O objeto de quadro, os objetos de exibição e o objeto de contêiner podem, opcionalmente, implementar IOleCommandTarget
para dar suporte ao despacho de determinados comandos, conforme discutido em Destinos de comando. Os objetos de exibição e contêiner também podem, opcionalmente, implementar IPrint
e IContinueCallback
para dar suporte à impressão programática, conforme discutido em Impressão programática.
A figura a seguir mostra as relações conceituais entre um contêiner e seus componentes (à esquerda) e o documento ativo e suas exibições (à direita). O documento ativo gerencia o armazenamento e os dados, e o modo de exibição exibe ou, opcionalmente, imprime esses dados. Interfaces em negrito são aquelas necessárias para a participação ativa do documento; aquelas em negrito e itálico são opcionais. Todas as outras interfaces são necessárias.
Um documento que dá suporte a apenas uma única exibição pode implementar os componentes de exibição e de documento (ou seja, suas interfaces correspondentes) em uma única classe concreta. Além disso, um site de contêiner que dá suporte apenas a uma exibição por vez pode combinar o site do documento e o site de exibição em uma única classe de site concreta. O objeto de quadro do contêiner, no entanto, deve permanecer distinto, e o componente do documento do contêiner é simplesmente incluído aqui para dar uma imagem completa da arquitetura; ele não é afetado pela arquitetura de contenção de documento ativa.
Objetos do site do documento
Na arquitetura de contenção de documento ativa, um site de documento é o mesmo que um objeto de site do cliente em Documentos OLE com a adição da interface IOleDocument
:
interface IOleDocumentSite : IUnknown
{
HRESULT ActivateMe(IOleDocumentView *pViewToActivate);
}
O site do documento é conceitualmente o contêiner para um ou mais objetos de "site de exibição". Cada objeto de site de exibição está associado a objetos de exibição individuais do documento gerenciados pelo site do documento. Se o contêiner oferecer suporte apenas a uma única exibição por site de documento, ele poderá implementar o site do documento e o site de exibição com uma única classe concreta.
Exibir objetos do site
O objeto de site de exibição de um contêiner gerencia o espaço de exibição para uma exibição específica de um documento. Além de dar suporte à interface padrão IOleInPlaceSite
, um site de exibição também geralmente implementa IContinueCallback
para controle de impressão programática. (Observe que o objeto de exibição nunca consulta para IContinueCallback
, portanto, ele pode realmente ser implementado em qualquer objeto desejado pelo contêiner.)
Um contêiner que dá suporte a vários modos de exibição deve ser capaz de criar vários objetos de site de exibição no site do documento. Isso fornece a cada exibição serviços de ativação e desativação separados, conforme fornecido por meio de IOleInPlaceSite
.
Objeto de Quadro
O objeto de quadro do contêiner é, na maioria das vezes, o mesmo quadro usado para ativação in-loco em Documentos OLE, ou seja, aquele que manipula a negociação de menu e barra de ferramentas. Um objeto de exibição tem acesso a esse objeto de quadro IOleInPlaceSite::GetWindowContext
, que também fornece acesso ao objeto de contêiner que representa o documento de contêiner (que pode lidar com a negociação da barra de ferramentas no nível do painel e a enumeração de objeto contido).
Um contêiner de documento ativo pode aumentar o quadro adicionando IOleCommandTarget
. Isso permite que ele receba comandos originados na interface do usuário do documento ativo da mesma forma que essa interface pode permitir que um contêiner envie os mesmos comandos (como Arquivo novo, Abrir, Salvar como, Imprimir; Editar cópia, Colar, Desfazer e outros) para um documento ativo. Para obter mais informações, consulte Destinos de comando.