Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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::Load
y 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, , IPrint
disponible 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").