Compartir a través de


Impresión mediante programación

OLE proporcionó los medios para identificar de forma única documentos persistentes (GetClassFile) y cargarlos en su código asociado (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Loady IPersistStorage::Load). Para habilitar aún más la impresión de documentos, la contención activa de documentos (mediante un diseño OLE existente no incluido con OLE 2.0 originalmente) introduce una interfaz de impresión estándar base, , IPrintdisponible con carácter general a través de cualquier objeto que pueda cargar el estado persistente del tipo de documento. Cada vista de un documento activo puede admitir opcionalmente la IPrint interfaz para proporcionar estas funcionalidades.

La IPrint interfaz se define de la siguiente manera:

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);
    };

Los clientes y contenedores simplemente usan IPrint::Print para indicar al documento que se imprima una vez cargado ese documento, especificando marcas de control de impresión, el dispositivo de destino, las páginas que se van a imprimir y opciones adicionales. El cliente también puede controlar la continuación de la impresión a través de la interfaz IContinueCallback (consulte a continuación).

Además, IPrint::SetInitialPageNum admite la capacidad de imprimir una serie de documentos como una mediante la numeración de páginas sin problemas, obviamente una ventaja para contenedores de documentos activos como Office Binder. IPrint::GetPageInfo hace que la visualización de información de paginación sea sencilla al permitir que el autor de la llamada recupere el número de página de inicio que se ha pasado SetInitialPageNum anteriormente (o al número de página inicial predeterminado interno del documento) y el número de páginas del documento.

Los objetos que admiten IPrint se marcan en el Registro con la clave "Imprimible" almacenada en clSID del objeto:

HKEY_CLASSES_ROOT\CLSID\{...}\Printable

IPrint normalmente se implementa en el mismo objeto que admite IPersistFile o IPersistStorage. Los autores de llamadas tienen en cuenta la capacidad de imprimir mediante programación el estado persistente de alguna clase buscando en el Registro la clave "Imprimible". Actualmente, "Printable" indica la compatibilidad con al menos IPrint; otras interfaces se pueden definir en el futuro, que después estarán disponibles a través QueryInterface de donde IPrint simplemente representa el nivel base de soporte técnico.

Durante un procedimiento de impresión, es posible que desee que el cliente o el contenedor que inició la impresión controle si la impresión debe continuar o no. Por ejemplo, el contenedor puede admitir un comando "Detener impresión" que debe finalizar el trabajo de impresión lo antes posible. Para admitir esta funcionalidad, el cliente de un objeto imprimible puede implementar un pequeño objeto receptor de notificaciones con la interfaz IContinueCallback:

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

Esta interfaz está diseñada para ser útil como una función de devolución de llamada de continuación genérica que tiene el lugar de los distintos procedimientos de continuación en la API win32 (como la AbortProc para imprimir y la enumeración de EnumMetafileProc metarchivo). Por lo tanto, este diseño de interfaz es útil en una amplia variedad de procesos que consumen mucho tiempo.

En los casos más genéricos, cualquier proceso largo llama a la IContinueCallback::FContinue función periódicamente. El objeto receptor devuelve S_OK para continuar con la operación y S_FALSE detener el procedimiento lo antes posible.

FContinue, sin embargo, no se usa en el contexto de IPrint::Print; en su lugar, la impresión usa IContinueCallback::FContinuePrint. Cualquier objeto de impresión debe llamar periódicamente al FContinuePrinting paso del número de páginas que han estado imprimiendo, el número de la página que se está imprimiendo y una cadena adicional que describe el estado de impresión que el cliente puede optar por mostrar al usuario (como "Página 5 de 19").

Consulte también

Contenedores de documentos activos