09 mayo 2011

Impresiones con Visual Basic 2010

PrinterPese a que vivimos en una era digital y todo (bueno, casi todo) se hace por internet y con la computadora, aún hay momentos en que el papel es necesario.  Hace tiempo escribí un post donde indicaba cómo imprimir usando Visual Basic 6, pero no había tenido la oportunidad de hacer lo mismo con el Visual Basic .net.  Y eso precisamente es lo que pienso hacer en esta ocasión: mostrar como usar los controles y cajas de diálogo para imprimir y la forma de imprimir tanto texto como imágenes.

Antes de continuar con rollo, código, ejemplos y demases, voy a describir brevemente los componentes que tiene Visual Basic 2010 para imprimir.

Control PrintDocument

Este control se debe agregar a cualquier proyecto en el que se quiera imprimir algo.  Haz de cuenta que es la hoja en blanco donde puedes dibujar diferentes objetos, escribir texto y colocar imágenes de mapa de bits.  Cuando acabes de dibujar, escribir, etc., se llama el método Print para que la impresora escupa la hoja.  Acepta todos los métodos de dibujo que usa el objeto Graphics (mismo del que di ejemplos aquí y aquí), es decir que si tienes que escribir texto, usas el método DrawString; si quieres dibujar un marco alrededor del texto, puedes usar DrawLine o DrawRectangle.  Aunque el control es invisible (no aparece en la ventana ni hay forma de ir viendo conforme se va dibujando), es muy útil.

Control PrintDialog

Este control hace aparecer la ventana default que te permite elegir y configurar la impresora que se desea emplear.  Si no se usa, la impresión se hace en la impresora que se tiene definida como default con las propiedades que trae por default (o sea con lo default de lo default Sonrisa).  Para que aparezca, se debe usar el método ShowDialog.

Control PageSetupDialog

Este control hace aparecer la ventana que te permite configurar el papel a usar: tamaño, orientación, márgenes, etc.  Se debe usar su método ShowDialog para que aparezca, igual que con el control PrintDialog.

Control PrintPreviewDialog

Este control hace aparecer una vista previa de lo que se va a imprimir.  Como mostraré más adelante, se debe vincular este control con lo el control PrintDocument para que todo lo que se va a imprimir, en lugar de ir a la impresora, aparezca en esta ventana.  También hay que tener cuidado: si no se tiene acceso a la impresora que está seleccionada (por ejemplo, una impresora de la red a la cual no tengo acceso en este momento o la que tengo conectada está apagada), no aparece la ventana y te marca error.  Es necesario recibir este error (con un Try…Catch) para que no termine abruptamente el programa solo porque no halla la impresora (cosa que no hago en este post, por cierto).

Ejemplo de su uso

Después de este rollo (que espero que haya sido breve), voy a ejemplificar el uso de estos controles en un programa que hice con mis queridísimos alumnos de 4TPO.  Es un ejemplo muy simple que solo muestra como se usan los controles.  Sin embargo, creo que con estas bases ya le pueden echar vuelo a la imaginación para aplicarlo en otros contextos.

Antes que nada, les muestro el diseño de la ventana principal.  Consta de 3 etiquetas, 3 cajas de texto (txtNombre, txtDir y txtRFC), un PictureBox (picCanoa) que sirve para mostrar como imprimir una imagen de mapa de bits, 7 botones cuyo código explicaré más adelante, 2 controles PrintDocument, un PrintDialog, un PageSetup y un PrintPreviewDialog.  Estos 5 últimos no aparecen en la ventana: cuando los agregas a la ventana aparecen en la parte inferior.

00Form1

Para que un PrintDocument funcione, es necesario editar su evento PrintPage.  Si le das doble clic al icono PrintDocument1, verás este código:

01PrintDocument1

Básicamente uso el parámetro e, que es “la hoja invisible” sobre la que voy a dibujar, para escribir 3 cadenas, un rectángulo y la imagen de la canoa.  Como mencioné con anterioridad, son las mismas funciones que se usan para dibujar gráficos sobre la ventana cosa que ya escribí en este post y en este también.

Una vez que tienes este evento listo, puedes mandar imprimir con la función Print.  Yo lo hago con el botón cuya etiqueta dice Imprimir y este es el código:

02btnImprimir

El PrintDocument2 muestra una idea para imprimir formatos.  Dibujé el esqueleto de un formato, lo guardé como PNG, lo importé a Visual Basic y lo puse en un PictureBox (llamado PictureBox1) en la ventana frmPicts.  Aquí está la ventana frmPicts y abajo el código que lo usa (primero el el botón que tiene la etiqueta Imprimir formato, btnImprime2, y luego PrintPage).

03frmPicts

04PrintDocument2

Configurar la impresora es muy simple usando el control PrintDialog.  Este es el código del botón con la etiqueta Configurar impresora.  Fíjate en la manera en que copio las propiedades puestas por el usuario en este cuadro de diálogo en los dos controles PrintDocument (en las 2 últimas instrucciones):

ConfigImpr

A la hora de ejecutarse, el control PrintDialog hace que aparezca esta ventana:

06PropImpresora

También es sencillo modificar la configuración de la página.  Este es el código del botón etiquetado Configurar página:

07btnConfPag

Antes del ShowDialog es necesario igualar sus propiedades a los que ya tiene un PrintDocument (en las dos instrucciones que siguen al comentario).  Al correr este evento, aparece esta ventana:

08ConfPag

Una vista previa (o presentación preeliminar) de lo que se va a imprimir suele ser bastante útil para muchos usuarios.  Hacer que aparezca es sencillísimo.  Lo único que hay que hacer es hacer que, en lugar de que el evento PrintPage de un PrintDocument lo mande a la impresora, se le envía a esta caja de diálogo.  Abajo pongo el código y luego la ventana que aparece que muestra la vista preeliminar:

09btnVistaPrev

10VistaPrevia

También es posible jugar con la configuración de la impresora.  Para leer algunas propiedades de las impresoras, hice el botón etiquetado Lista de impresoras que abre la ventana frmImpresoras desde donde se pueden ver la lista de impresoras instaladas y al seleccionar una de ellas, se ven algunas de sus propiedades.  Esta es la ventana frmImpresoras en la vista diseño:

11frmImpresoras

Tiene una lista donde voy a escribir la lista de impresoras (ListBox1), etiquetas que muestran los valores de las copias, si es duplex (si puede imprimir por ambas caras de la hoja), el número máximo de copias permitidas y si puede recibir documentos a color (lblCopias, lblDuplex, lblCopiasMax y lblColor, respectivamente).  También es necesario un PrintDocument para poder ver estas propiedades.  Pero antes que nada, veamos el código con que llena ListBox1:

12frmImpresoras

Nótese que estoy haciendo uso de la colección Printing.PrinterSettings.InstalledPrinters misma que contiene la lista de todas las impresoras instaladas en el equipo donde se está ejecutando.  Estoy usando la instrucción With para abreviar un poco y no escribir este rollo a cada rato.

No necesito escribir un evento PrintPage para el PrintDocument1 porque no voy a imprimir nada: solo lo necesito para poder mostrar las propiedades.  Por esta razón el otro código interesante es el que se ejecuta cuando ListBox1 cambia de elemento seleccionado:

13ListBox1

Este es un ejemplo de como se ve esta ventana con una impresora seleccionada:

14frmImpresoras

Espero que este documento te sea útil.  ¡Hasta la próxima!

P.D. La imagen que usé de la impresora verde fue hecho por OCAL.  De gran ayuda para elaborar este post fue el siguiente libro:

Publicar un comentario
Related Posts Plugin for WordPress, Blogger...