Partilhar via


Impressão programática

O OLE forneceu os meios para identificar exclusivamente documentos persistentes (GetClassFile) e carregá-los para seu código associado (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Loade IPersistStorage::Load). Para habilitar ainda mais a impressão de documentos, a independência de documentos ativos (usando um design OLE não fornecido com o OLE 2.0 originalmente) introduz uma interface de impressão padrão base, IPrint, em disponibilidade geral por meio de qualquer objeto que possa carregar o estado persistente do tipo de documento. Cada exibição de um documento ativo pode dar suporte à interface IPrint para fornecer esses recursos.

A IPrint interface é definida da seguinte forma:

interface IPrint : IUnknown
    {
    HRESULT SetInitialPageNum([in] LONG nFirstPage);
    HRESULT GetPageInfo(
        [out] LONG *pnFirstPage,
        [out] LONG *pcPages);
    HRESULT Print(
        [in] DWORD grfFlags,
        [in,out] DVTARGETDEVICE **pptd,
        [in,out] PAGESET ** ppPageSet,
        [in,out] STGMEDIUM **ppstgmOptions,
        [in] IContinueCallback* pCallback,
        [in] LONG nFirstPage,
        [out] LONG *pcPagesPrinted,
        [out] LONG *pnPageLast);
    };

Os clientes e contêineres simplesmente usam IPrint::Print para instruir o documento a se imprimir depois de ser carregado, especificando sinalizadores de controle de impressão, o dispositivo de destino, as páginas a serem impressas e opções adicionais. O cliente também pode controlar a continuação da impressão por meio da interface IContinueCallback (veja abaixo).

Além disso, IPrint::SetInitialPageNum dá suporte à capacidade de imprimir uma série de documentos como um numerando as páginas perfeitamente, um claro benefício para contêineres de documentos ativos, como o Office Binder. IPrint::GetPageInfo torna simples a exibição de informações de paginação, permitindo que o chamador recupere o número de página inicial anteriormente passado para SetInitialPageNum (ou o número de página inicial padrão interno do documento) e o número de páginas no documento.

Os objetos que dão suporte a IPrint são marcados no Registro com a chave "Imprimível" armazenada sob a CLSID do objeto:

HKEY_CLASSES_ROOT\CLSID\{...}\Printable

IPrint geralmente é implementado no mesmo objeto que dá suporte a IPersistFile ou IPersistStorage. Os chamadores observam a capacidade de imprimir programaticamente o estado persistente de alguma classe procurando no Registro a chave "Imprimível". No momento, "Imprimível" indica suporte para pelo menos IPrint; no futuro, poderão ser definidas outras interfaces que estarão disponíveis por meio de QueryInterface em que IPrint simplesmente representa o nível base de suporte.

Durante um procedimento de impressão, talvez você queira que o cliente ou contêiner que iniciou a impressão controle se a impressão deve ou não continuar. Por exemplo, o contêiner pode dar suporte a um comando "Stop Print" que deve encerrar o trabalho de impressão o mais rápido possível. Para dar suporte a essa funcionalidade, o cliente de um objeto imprimível pode implementar um objeto de coletor de notificação pequeno com a interface IContinueCallback:

interface IContinueCallback : IUnknown
    {
    HRESULT FContinue(void);
    HRESULT FContinuePrinting(
        [in] LONG cPagesPrinted,
        [in] LONG nCurrentPage,
        [in] LPOLESTR pszPrintStatus);
    };

Essa interface foi projetada para ser útil como uma função de retorno de chamada de continuação genérica que assume o lugar dos vários procedimentos de continuação na API Win32 (como AbortProc para impressão e EnumMetafileProc para enumeração de meta-arquivo). Portanto, esse design de interface é útil em uma ampla variedade de processos demorados.

Nos casos mais genéricos, a função IContinueCallback::FContinue é chamada periodicamente por qualquer processo demorado. O objeto coletor retorna S_OK para continuar a operação e S_FALSE interromper o procedimento o mais rápido possível.

FContinue, no entanto, não é usado no contexto de IPrint::Print; em vez disso, a impressão usa IContinueCallback::FContinuePrint. Qualquer objeto de impressão deve chamar FContinuePrinting periodicamente passando o número de páginas impressas, o número da página que está sendo impressa e uma cadeia de caracteres adicional que descreve o status de impressão que o cliente pode optar por exibir ao usuário (como "Página 5 de 19").

Confira também

Contêineres de documento ativos