Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
OLE forneceu os meios para identificar exclusivamente documentos persistentes (GetClassFile) e carregá-los em seu código associado (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load, e IPersistStorage::Load). Para permitir melhor a impressão de documentos, a contenção ativa de documentos (usando um design OLE existente não incluído originalmente no OLE 2.0) introduz uma interface de impressão padrão base, IPrint geralmente disponível através de qualquer objeto que possa carregar o estado persistente do tipo de documento. Cada exibição de um documento ativo pode, opcionalmente, suportar a IPrint interface 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 imprimir-se assim que o documento for 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 através da interface IContinueCallback (veja abaixo).
Além disso, IPrint::SetInitialPageNum permite imprimir uma série de documentos como se fosse um único documento, assegurando de forma contínua e perfeita a numeração das páginas, obviamente um benefício para aplicações de contenção de documentos ativas como o Office Binder.
IPrint::GetPageInfo simplifica a exibição de informações de paginação, permitindo que a função chamadora recupere o número da página inicial passada anteriormente para SetInitialPageNum (ou o número padrão da página inicial interna do documento) e o número de páginas no documento.
Os objetos que suportam IPrint são marcados no registro com a chave "Imprimível" armazenada sob o CLSID do objeto:
HKEY_CLASSES_ROOT\CLSID\{...}\Printable
IPrint geralmente é implementado no mesmo objeto que suporta um IPersistFile ou IPersistStorage. Os chamadores observam a capacidade de imprimir programaticamente o estado persistente de alguma classe, procurando no registro a chave "Imprimível". Atualmente, "Imprimível" indica suporte para, pelo menos, IPrint. No futuro, outras interfaces podem ser definidas e estarão disponíveis através de QueryInterface, onde IPrint representa apenas o nível básico de suporte.
Durante um procedimento de impressão, talvez você queira que o cliente ou o contêiner que iniciou a impressão controle se a impressão deve ou não continuar. Por exemplo, o contêiner pode suportar um comando "Parar impressão" que deve encerrar o trabalho de impressão o mais rápido possível. Para suportar esse recurso, o cliente de um objeto imprimível pode implementar um pequeno objeto de coletor de notificação 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 substitui os vários procedimentos de continuação na API Win32 (como o AbortProc para impressão e o EnumMetafileProc para enumeração de metaarquivos). Assim, este design de interface é útil em uma ampla variedade de processos demorados.
Nos casos mais genéricos, a IContinueCallback::FContinue função é chamada periodicamente por qualquer processo de longa duração. O objeto do coletor retorna S_OK para continuar a operação e S_FALSE para parar o procedimento o mais rápido possível.
FContinue, no entanto, não é usado no contexto de IPrint::Print; pelo contrário, a impressão usa IContinueCallback::FContinuePrint. Qualquer objeto de impressão deve ligar FContinuePrinting periodicamente passando o número de páginas que foram impressas, o número da página que está sendo impressa e uma cadeia de caracteres adicional descrevendo o status de impressão que o cliente pode optar por exibir ao usuário (como "Página 5 de 19").