Compartir a través de


Documentos de varias páginas

En este artículo se describe el protocolo de impresión de Windows y se explica cómo imprimir documentos que contienen más de una página. En el artículo se tratan los temas siguientes:

El protocolo de impresión

Para imprimir un documento de varias páginas, el marco y la vista interactúan de la siguiente manera. En primer lugar, el marco muestra el cuadro de diálogo Imprimir , crea un contexto de dispositivo para la impresora y llama a la función miembro StartDoc del objeto CDC . A continuación, para cada página del documento, el marco llama a la función miembro StartPage del CDC objeto , indica al objeto de vista que imprima la página y llame a la función miembro EndPage . Si el modo de impresora debe cambiarse antes de iniciar una página determinada, la vista llama a ResetDC, que actualiza la estructura DEVMODE que contiene la nueva información del modo de impresora. Cuando se ha impreso todo el documento, el marco llama a la función miembro EndDoc .

Invalidación de funciones de clase View

La clase CView define varias funciones miembro a las que llama el marco durante la impresión. Al invalidar estas funciones en la clase de vista, se proporcionan las conexiones entre la lógica de impresión del marco y la lógica de impresión de la clase de vista. En la tabla siguiente se enumeran estas funciones miembro.

Funciones reemplazables de CView para imprimir

Nombre Motivo de invalidación
OnPreparePrinting Para insertar valores en el cuadro de diálogo Imprimir, especialmente la longitud del documento
OnBeginPrinting Para asignar fuentes u otros recursos de GDI
OnPrepareDC Para ajustar los atributos del contexto del dispositivo para una página determinada o para realizar la paginación en tiempo de impresión
OnPrint Para imprimir una página determinada
OnEndPrinting Para desasignar recursos de GDI

También puede realizar el procesamiento relacionado con la impresión en otras funciones, pero estas funciones son las que impulsan el proceso de impresión.

En la ilustración siguiente se muestran los pasos implicados en el proceso de impresión y se muestra dónde se llama a cada una de las funciones miembro de CViewimpresión. En el resto de este artículo se explica la mayoría de estos pasos con más detalle. En el artículo Asignación de recursos de GDI se describen partes adicionales del proceso de impresión.

Proceso de bucle de impresión.
Bucle de impresión

Paginación

El marco almacena gran parte de la información sobre un trabajo de impresión en una estructura CPrintInfo . Varios de los valores CPrintInfo de pertenecen a la paginación; estos valores son accesibles como se muestra en la tabla siguiente.

Información de número de página almacenada en CPrintInfo

Variable miembro o

nombres de función
Número de página al que se hace referencia
GetMinPage/SetMinPage Primera página del documento
GetMaxPage/SetMaxPage Última página del documento
GetFromPage Primera página que se va a imprimir
GetToPage Última página que se va a imprimir
m_nCurPage Página que se está imprimiendo actualmente

Los números de página comienzan en 1, es decir, la primera página se numera 1, no 0. Para obtener más información sobre estos y otros miembros de CPrintInfo, vea la referencia de MFC.

Al principio del proceso de impresión, el marco llama a la función miembro OnPreparePrinting de la vista, pasando un puntero a una CPrintInfo estructura. El Asistente para aplicaciones proporciona una implementación de OnPreparePrinting que llama a DoPreparePrinting, otra función miembro de CView. DoPreparePrinting es la función que muestra el cuadro de diálogo Imprimir y crea un contexto de dispositivo de impresora.

En este momento, la aplicación no sabe cuántas páginas hay en el documento. Usa los valores predeterminados 1 y 0xFFFF para los números de la primera y la última página del documento. Si sabe cuántas páginas tiene el documento, invalide OnPreparePrinting y llame a [SetMaxPage]--brokenlink---(reference/cprintinfo-class.md#setmaxpage) para la CPrintInfo estructura antes de enviarlo a DoPreparePrinting. Esto le permite especificar la longitud del documento.

DoPreparePrinting a continuación, muestra el cuadro de diálogo Imprimir. Cuando devuelve, la CPrintInfo estructura contiene los valores especificados por el usuario. Si el usuario desea imprimir solo un intervalo seleccionado de páginas, puede especificar los números de página inicial y final en el cuadro de diálogo Imprimir. El marco recupera estos valores mediante las GetFromPage funciones y GetToPage de CPrintInfo. Si el usuario no especifica un intervalo de páginas, el marco llama GetMinPage a y GetMaxPage usa los valores devueltos para imprimir todo el documento.

Para cada página de un documento que se va a imprimir, el marco llama a dos funciones miembro en la clase de vista, OnPrepareDC y OnPrint, y pasa cada función dos parámetros: un puntero a un objeto CDC y un puntero a una CPrintInfo estructura. Cada vez que el marco llama OnPrepareDC a y OnPrint, pasa un valor diferente en el miembro m_nCurPage de la CPrintInfo estructura. De este modo, el marco indica a la vista qué página se debe imprimir.

La función miembro OnPrepareDC también se usa para la pantalla. Realiza ajustes en el contexto del dispositivo antes de que se realice el dibujo. OnPrepareDC desempeña un rol similar en la impresión, pero hay un par de diferencias: en primer lugar, el CDC objeto representa un contexto de dispositivo de impresora en lugar de un contexto de dispositivo de pantalla y, en segundo lugar, se pasa un CPrintInfo objeto como segundo parámetro. (Este parámetro es NULL cuando OnPrepareDC se llama a para la pantalla). Invalide OnPrepareDC para realizar ajustes en el contexto del dispositivo en función de la página que se está imprimiendo. Por ejemplo, puede mover el origen de la ventanilla y la región de recorte para asegurarse de que se imprime la parte adecuada del documento.

La función miembro OnPrint realiza la impresión real de la página. En el artículo How Default Printing Is Done (Cómo se realiza la impresión predeterminada) se muestra cómo el marco llama a OnDraw con un contexto de dispositivo de impresora para realizar la impresión. De forma más precisa, el marco llama OnPrint a con una CPrintInfo estructura y un contexto de dispositivo y OnPrint pasa el contexto del dispositivo a OnDraw. Invalide OnPrint para realizar cualquier representación que se debe realizar solo durante la impresión y no para la pantalla. Por ejemplo, para imprimir encabezados o pies de página (consulte el artículo Encabezados y pies de página para obtener más información). A continuación, llame OnDraw a desde la invalidación de OnPrint para realizar la representación común a la visualización de pantalla y a la impresión.

El hecho de que haga la representación tanto para la visualización de pantalla como para la impresión significa que la aplicación es WYSIWYG: "Lo que OnDraw ve es lo que obtiene". Sin embargo, supongamos que no está escribiendo una aplicación WYSIWYG. Por ejemplo, considere un editor de texto que usa una fuente en negrita para imprimir, pero muestra códigos de control para indicar texto en negrita en la pantalla. En tal situación, se usa OnDraw estrictamente para la pantalla. Al invalidar OnPrint, sustituya la llamada a OnDraw por una llamada a una función de dibujo independiente. Esa función dibuja el documento de la forma en que aparece en papel, usando los atributos que no se muestran en la pantalla.

Páginas de impresora frente a Páginas de documentos

Cuando se hace referencia a números de página, a veces es necesario distinguir entre el concepto de impresora de una página y el concepto de un documento de una página. Desde el punto de vista de la impresora, una página es una hoja de papel. Sin embargo, una hoja de papel no es necesariamente igual a una página del documento. Por ejemplo, si va a imprimir un boletín, donde se plegarán las hojas, una hoja de papel podría contener las primeras y las últimas páginas del documento, en paralelo. Del mismo modo, si va a imprimir una hoja de cálculo, el documento no consta de páginas en absoluto. En su lugar, una hoja de papel puede contener filas de 1 a 20 columnas de 6 a 10.

Todos los números de página de la estructura CPrintInfo hacen referencia a páginas de impresora. El marco llama OnPrepareDC a y OnPrint una vez por cada hoja de papel que pasará por la impresora. Al invalidar la función OnPreparePrinting para especificar la longitud del documento, debe usar páginas de impresora. Si hay una correspondencia uno a uno (es decir, una página de impresora es igual a una página de documento), esto es fácil. Si, por otro lado, las páginas de documento y las páginas de impresora no corresponden directamente, debe traducir entre ellas. Por ejemplo, considere la posibilidad de imprimir una hoja de cálculo. Al reemplazar OnPreparePrinting, debe calcular cuántas hojas de papel se necesitarán para imprimir toda la hoja de cálculo y, a continuación, usar ese valor al llamar a la SetMaxPage función miembro de CPrintInfo. Del mismo modo, al invalidar OnPrepareDC, debe traducir m_nCurPage en el intervalo de filas y columnas que aparecerán en esa hoja concreta y, a continuación, ajustar el origen de la ventanilla en consecuencia.

paginación de Print-Time

En algunas situaciones, es posible que la clase de vista no sepa con antelación cuánto tiempo dura el documento hasta que se haya impreso realmente. Por ejemplo, supongamos que la aplicación no es WYSIWYG, por lo que la longitud de un documento en la pantalla no se corresponde con su longitud cuando se imprime.

Esto provoca un problema al invalidar OnPreparePrinting para la clase de vista: no se puede pasar un valor a la función de la SetMaxPage estructura CPrintInfo , ya que no conoce la longitud de un documento. Si el usuario no especifica un número de página para dejar de usar el cuadro de diálogo Imprimir, el marco no sabe cuándo detener el bucle de impresión. La única manera de determinar cuándo detener el bucle de impresión es imprimir el documento y ver cuándo finaliza. La clase de vista debe comprobar el final del documento mientras se imprime y, a continuación, informar al marco cuando se alcanza el final.

El marco de trabajo se basa en la función OnPrepareDC de la clase de vista para indicarle cuándo se debe detener. Después de cada llamada a OnPrepareDC, el marco comprueba un miembro de la CPrintInfo estructura denominada m_bContinuePrinting. Su valor predeterminado es TRUE. Siempre que permanezca así, el marco continúa el bucle de impresión. Si se establece en FALSE, el marco se detiene. Para realizar la paginación en tiempo de impresión, invalide OnPrepareDC para comprobar si se ha alcanzado el final del documento y establecer m_bContinuePrinting enFALSE cuando tenga.

La implementación predeterminada de OnPrepareDC conjuntos m_bContinuePrinting a FALSE si la página actual es mayor que 1. Esto significa que si no se especificó la longitud del documento, el marco supone que el documento es de una página larga. Una consecuencia de esto es que debe tener cuidado si llama a la versión de clase base de OnPrepareDC. No suponga que m_bContinuePrinting será TRUE después de llamar a la versión de la clase base.

¿Qué quieres saber más sobre

Consulte también

Impresión
CView (clase)
CDC (clase)