PrintDialog
ste pretende ser un ejemplo muy simple y breve en visual basic .net. Sencillo para que se entienda
rapidamente su funcionamiento y breve (con muy poco cdigo) para que nada nos estorbe a la hora de ponerle
nuestro toque personal. Los programadores somos muy creativos y me a pasado muchas veces que me
encontr con ejemplos muy complejos y llenos de cdigo, los cuales tuve que desmenuzar y analizar por
partes para poder entender su funcionamiento. As que trato de poner en todos mis post ejemplos concretos,
simples y que funcionen con solo copiar, pegar y hacer una mimina configuracin a los controles.
Necesitamos:
Un Winform (Form1), un control PrintDocument (PrintDocument1), un control PrintDialog (PrintDialog1), un
TextBox (TextBox1) y un Botn (Button1). El formulario debera tener un aspecto similar al de esta imagen:
Al ejecutar el programa este imprimir el contenido de la caja de texto como titulo de la pagina y diez lineas
de ejemplo utilizando distinta y furnte y tamao. El resultado se ver similar al de la siguiente imagen:
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
e.Graphics.DrawString(CStr(Format(Date.Now, "dd/MM/yyy")),
printFont, Brushes.Black, 470, 60)
18.
19.
e.Graphics.DrawString(info.nombres, printFont,
Brushes.Black, 200, 80)
20. .
21. .
22. .
23. .
24. .
25. .
26. .
27. .
28. .
29.
30.
i = i + 1
31.
32.
End While
33.
34.
35.
36.
37.
e.HasMorePages = False
38.
i = 0
39.
End If
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
imgenes de mapa de bits. Cuando acabes de dibujar, escribir, etc., se llama el
mtodo Print para que la impresora escupa la hoja. Acepta todos los mtodos 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 mtodo 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 impresin 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
). Para que
Control PageSetupDialog
Este control hace aparecer la ventana que te permite configurar el papel a usar: tamao,
orientacin, mrgenes, etc. Se debe usar su mtodo 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 ms
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. Tambin 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 TryCatch) 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
Despus de este rollo (que espero que haya sido breve), voy a ejemplificar el uso de estos
controles en un programa que hice con mis queridsimos 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 imaginacin para aplicarlo en otros contextos.
Antes que nada, les muestro el diseo 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 cdigo explicar ms adelante, 2
controles PrintDocument, un PrintDialog, un PageSetup y unPrintPreviewDialog.
Estos 5 ltimos no aparecen en la ventana: cuando los agregas a la ventana aparecen en la parte
inferior.
Bsicamente uso el parmetro e, que es la hoja invisible sobre la que voy a dibujar, para
escribir 3 cadenas, un rectngulo y la imagen de la canoa. Como mencion con anterioridad,
son las mismas funciones que se usan para dibujar grficos sobre la ventana cosa que ya
escrib en este post y en este tambin.
Una vez que tienes este evento listo, puedes mandar imprimir con la funcin Print. Yo lo hago
con el botn cuya etiqueta dice Imprimir y este es el cdigo:
Configurar la impresora es muy simple usando el control PrintDialog. Este es el cdigo del
botn con la etiqueta Configurar impresora. Fjate en la manera en que copio las propiedades
puestas por el usuario en este cuadro de dilogo en los dos controlesPrintDocument (en las 2
ltimas instrucciones):
Antes del ShowDialog es necesario igualar sus propiedades a los que ya tiene
unPrintDocument (en las dos instrucciones que siguen al comentario). Al correr este evento,
aparece esta ventana:
Una vista previa (o presentacin preeliminar) de lo que se va a imprimir suele ser bastante til
para muchos usuarios. Hacer que aparezca es sencillsimo. 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 enva a esta caja de dilogo. Abajo pongo el cdigo y luego la ventana que aparece que
muestra la vista preeliminar:
Tambin es posible jugar con la configuracin de la impresora. Para leer algunas propiedades
de las impresoras, hice el botn etiquetado Lista de impresoras que abre la
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 nmero
mximo de copias permitidas y si puede recibir documentos a color
(lblCopias, lblDuplex, lblCopiasMax y lblColor, respectivamente). Tambin es
necesario un PrintDocument para poder ver estas propiedades. Pero antes que nada, veamos
el cdigo con que llena ListBox1:
de todas las impresoras instaladas en el equipo donde se est ejecutando. Estoy usando la
instruccin 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 razn
el otro cdigo interesante es el que se ejecuta cuando ListBox1 cambia de
elemento seleccionado: