Compartir a través de


Impresión mediante programación

Nota:

La biblioteca Microsoft Foundation Classes (MFC) sigue siendo compatible. Sin embargo, ya no estamos agregando características ni actualizando la documentació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 permite imprimir una serie de documentos como uno solo al numerar las páginas de manera continua, lo cual es obviamente una ventaja para contenedores de documentos activos como Office Binder. IPrint::GetPageInfo simplifica la visualización de información de paginación permitiendo al llamante recuperar el número de página de inicio que se pasó previamente a SetInitialPageNum (o el número de página de inicio predeterminado del documento) y el número total 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 llamada notan la capacidad de imprimir mediante programación el estado persistente de alguna clase si se busca la clave "Printable" en el Registro. 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 toma el lugar de los distintos procedimientos de continuación en la API Win32 (como AbortProc para la impresión y EnumMetafileProc para la enumeración del 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, la función IContinueCallback::FContinue es llamada periódicamente por cualquier proceso largo. El objeto receptor devuelve S_OK para continuar 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, pasando el número de páginas que se han impreso, el número de la página que se está imprimiendo, y una cadena adicional que describe el estado de impresión, como "Página 5 de 19", que el cliente puede mostrar al usuario.

Consulte también

Contenedores de documentos activos