TN030: Personalización de impresión y vista previa de impresión

Esta nota describe el proceso de personalización de impresión y vista previa de impresión y describe los efectos de las rutinas de devolución de llamada CView y las rutinas de devolución de llamada y funciones miembro de CPreviewView.

El problema

MFC proporciona una solución completa para la impresión de la mayoría y necesita de la vista previa de impresión. En la mayoría de los casos, poco código adicional es necesario para tener una visión capaz de imprimir y obtener una vista previa. Sin embargo, existen formas de optimizar la impresión que requieren un esfuerzo significativo por parte de los desarrolladores, y algunas aplicaciones agregar elementos de la interfaz de usuario específica para el modo de vista previa de impresión.

Impresión eficiente

Cuando una aplicación MFC imprime utilizando los métodos estándar, Windows dirige todas las llamadas de salida de interfaz de dispositivo gráfico (GDI) a un metarchivo en memoria. Cuando se llama a EndPage , Windows reproduce el metarchivo de una vez para cada banda física que requiere la impresora para imprimir una página. Durante este procesamiento, GDI consulta con frecuencia el procedimiento anular para determinar si debe continuar. Normalmente el procedimiento de anulación permite mensajes ser procesado por lo que el usuario puede cancelar el trabajo de impresión mediante un cuadro de diálogo de impresión.

Lamentablemente, esto puede ralentizar el proceso de impresión. Si la impresión en su aplicación debe ser más rápida de lo que puede lograrse mediante la técnica estándar, debe aplicar bandas manual.

Imprimir bandas

Para la banda manualmente, debe re implementar el bucle de impresión que AlImprimir se llama varias veces por página (una vez por banda). El bucle de impresión está implementado en la función OnFilePrint en viewprnt.cpp. En su CView-derivado de la clase, sobrecarga esta función para que la entrada de mapa de mensajes para controlar el comando Imprimir llama a la función de impresión. Copiar la rutina de OnFilePrint y cambiar el bucle de impresión para aplicar bandas. Probablemente también desee pasar el rectángulo de bandas a las funciones de impresión por lo que puede optimizar el dibujo basado en la sección de la página que se imprime.

En segundo lugar, con frecuencia se debe llamar QueryAbort al dibujo de la banda. De lo contrario, no consigue llamará al procedimiento de abortar y el usuario no podrá cancelar el trabajo de impresión.

Vista previa de impresió&n: nbsp; Papel electrónico con interfaz de usuario

Preliminar, en esencia, intenta activar la visualización en una emulación de una impresora. De forma predeterminada, el área de cliente de la ventana principal se utiliza para mostrar una o dos páginas totalmente dentro de la ventana. El usuario es capaz de acercarse a un área de la página para ver con más detalle. Con el apoyo adicional, el usuario aún podrá autorizarse para editar el documento en modo de vista previa.

Personalización de la vista previa de impresión

Esta nota sólo se ocupa de un aspecto de la modificación de la vista previa de impresión: interfaz de usuario agregando a modo de vista previa. Otras modificaciones son posibles, pero esos cambios están fuera del alcance de este debate.

Brevemente, es el proceso de adición de IU en el modo de vista previa:

  1. Derivar una clase de vista de CPreviewView.

  2. Agregar controladores de comando para los aspectos de la interfaz de usuario que desee.

  3. Si está agregando aspectos visuales de la pantalla, reemplazar OnDraw y realizar el dibujo después de llamar a CPreviewView::OnDraw.

OnFilePrintPreview

Este es el controlador del comando de vista previa de impresión. Su implementación predeterminada es:

void CView::OnFilePrintPreview()
{
 nbsp;  / / En las clases derivadas, implementar ventana especial manejo aquí
    / / Asegúrese de desenganche marco ventana Cerrar si engancha.

/ / no se debe crear en el marco. Debe sobrevive esta función
    CPrintPreviewState * pState = new CPrintPreviewState;

if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, este,
                RU&NTIME_CLASS(CPreviewView), pState))
    {
        / / En las clases derivadas, inverso manejo de ventana especial
        / / aquí en caso de fracaso de vista previa

TRACE0 ("Error: error de DoPrintPreview");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        eliminar pState;      / / vista previa no se pudo inicializar, / / eliminar estado ahora
    }
}

DoPrintPreview ocultar el panel principal de la aplicación. Barras de control, tales como la barra de Estado puede conservarse, especificando en el pState-gt;miembro de dwStates (esto es una máscara de bits y los bits para barras de control individual se definen por AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)). La ventana pState - >nIDMainPane es la ventana que se oculta automáticamente y reshown. DoPrintPreview , a continuación, creará una barra de botones para la interfaz de usuario estándar de vista previa. Si es necesario el manejo de ventana especial, tal como para ocultar o mostrar otras ventanas, que deben hacerse antes de DoPrintPreview se llama.

De forma predeterminada, cuando finaliza la vista previa de impresión, devuelve las barras de control a sus Estados originales y en el panel principal a visible. Si es necesario tratamiento especial, debe hacerse en una anulación de EndPrintPreview. Si se produce un error en la DoPrintPreview , también proporcionan tratamiento especial.

Se llama a DoPrintPreview:

EndPrintPreview

Esto es llamado para cancelar el modo de vista previa de impresión. A menudo es conveniente desplazarse a la pá&gina en el documento que fue modificada aparece en vista preliminar. EndPrintPreview es la oportunidad de la aplicación para hacerlo. PInfo-gt;miembro m_nCurPage es la página en la que fue última muestra (izquierda si se muestran dos páginas), y el puntero es una sugerencia a donde estaba interesado el usuario en la página. Dado que la estructura de la vista de la aplicación es desconocida para el marco, debe proporcionar el código para mover el punto seleccionado.

Debe realizar la mayoría de las acciones antes de llamar a CView::EndPrintPreview. Esta llamada invierte los efectos de la DoPrintPreview y elimina pView, pDC y pInfo.

/ / Cualquier otra limpieza debe hacerse aquí.
CView::EndPrintPreview (pDC, pInfo, punto, pView)

CWinApp::OnFilePrintSetup

Esto se debe asignar para el elemento de menú de configuración de impresión. En la mayoría de los casos, no es necesario reemplazar la implementación.

Nomenclatura de página

Otra cuestión es la numeración de páginas y el orden. Para aplicaciones de tipo de procesador de textos sencillo, esto es una cuestión sencilla. La mayoría de los sistemas preliminar asuman que cada página impresa corresponde a una página en el documento.

¿Para intentar dar una solución generalizada, hay varias cosas que considerar. Imagine un sistema CAD. El usuario tiene un dibujo que cubre varias hojas de tamaño E. Un E-tamaño (o un menor escala) trazador, numeración de páginas sería como en el caso simple. Pero en una impresora láser, impresión de 16 páginas a tamaño por hoja, lo que tiene en vista previa de impresión cuenta una "página"?

Como se señala en el párrafo introductorio, vista previa de impresión está actuando como una impresora. Por lo tanto, el usuario verá lo que vendría de la impresora especial que está seleccionada. Corresponde a la vista para determinar qué imagen se imprime en cada página.

La cadena de descripción de página de la estructura CPrintInfo proporciona un medio para mostrar el número de página al usuario si puede representarse como un número de página (como en "Page 1" o "páginas 1-2"). Esta cadena se utiliza la implementación predeterminada de CPreviewView::OnDisplayPageNumber. Si es necesaria una presentación diferente, uno puede reemplazar esta función virtual para proporcionar, por ejemplo, "Sheet1, secciones A, B".

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index