Buscar

Email Elinv.
Búsqueda personalizada

viernes, 8 de abril de 2011

Imprimir formulario mas grande que la pantalla por Elinv.

/*
*
Código desarrollado por Elinv.

* http://www.bragadomas.com/forodeprogramacion/index.php
*
http://www.bragadomas.com
*
http://www.bragadomas.com.ar
*
http://luispedromendez.blogspot.com/
*
http://elinv-elinv.blogspot.com/?expref=next-blog
*/

:arrow: 'El método PrintForm imprime sólo la parte del formulario que se muestra.
'Este artículo muestra cómo imprimir un formulario que es más grande que la pantalla o que sólo se ve parcialmente.

:arrow: 'Si necesitas imprimir un formulario mayor que la pantalla, o que sólo se muestra parcialmente,
'debes situar los controles del formulario en un PictureBox.
'Este imprime el bitmap que contiene, en lugar de la captura de pantalla del formulario que es lo que hace PrintForm.
'Como el bitmap del PictureBox está almacenado en un device context en memoria, tienes acceso al bitmap entero y no a la parte que se muestra.

:arrow: 'NOTA: Para el propósito de este artículo, la altura del formulario se ha puesto en 11 pulgadas.
'Si necesitas otro tamaño, como 8,5 x 14 pulgadas, modifica la variable sTall.
'También debes tener en cuenta que esta medidas están realizadas en twips porque es la escala por defecto de los formualrios.
'Si cambias la propiedad ScaleMode necesitas cambiar estos valores adecuadamente.

:arrow: 'Imprimir un formulario más grande que la pantalla.
'- Arranca un nuevo proyecto, se creará el formulario Form1 por defecto.
'- Añade dos PictureBox al formulario, evitando situar el segundo dentro del primero.
'- Pulsa con el botón derecho sobre Picture2 y selecciona "Enviar al fondo".
'- Añade dos etiquetas al Picture1, dejando Picture2 vacío.
'- Añade el siguiente código a la sección de Declaraciones del formulario Form1:

Private Const twipFactor = 1440
Private Const WM_PAINT = &HF
Private Const WM_PRINT = &H317
Private Const PRF_CLIENT = &H4& ' Dibuja el area cliente de la ventana.
Private Const PRF_CHILDREN = &H10& ' Dibuja todas las ventanas hijas.
Private Const PRF_OWNED = &H20& ' Dibuja todas las propiedades de la ventana.
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Sub Form_Load()
Dim sWide As Single, sTall As Single
Dim rv As Long
Me.ScaleMode = vbTwips ' Está por defecto
sWide = 8.5
sTall = 11 ' or 14, etc.
Me.Width = twipFactor * sWide
Me.Height = twipFactor * sTall
With Picture1
.Top = 0
.Left = 0
.Width = twipFactor * sWide
.Height = twipFactor * sTall
End With
With Picture2
.Top = 0
.Left = 0
.Width = twipFactor * sWide
.Height = twipFactor * sTall
End With
With Label1
.Caption = "Top"
.Left = Me.Width / 2
.Top = 0
End With
With Label2
.Caption = "Bottom"
.Top = (twipFactor * sTall) - .Height * 2
.Left = Me.Width / 2
End With
Me.Visible = True
DoEvents
Picture1.SetFocus
Picture2.AutoRedraw = True
rv = SendMessage(Picture1.hwnd, WM_PAINT, Picture2.hDC0)
rv = SendMessage(Picture1.hwnd, WM_PRINT, Picture2.hDC, _
PRF_CHILDREN + PRF_CLIENT + PRF_OWNED)
Picture2.Picture = Picture2.Image
Picture2.AutoRedraw = False
Printer.Print ""
Printer.PaintPicture Picture2.Picture00
Printer.EndDoc
End Sub
'------------------------------------------------------------------
'- Ejecuta el proyecto.
'Las etiquetas Top y Botton deben aparecer en sus respectivas posiciones,
'independientemente de si el formulario se muestra por completo.
'Imprimir un formulario en más de una página.
'Si el formulario que estás imprimiendo es demasiado grande para caber en una página puedes emplear un sistema similar. El método PaintPicture tiene varios parámetros opcionales que sirven, entre otras cosas, para imprimir sólo parte de la imagen.
'Para verlo localiza el siguiente código en el ejemplo anterior:
'Printer.Print ""
'Printer.PaintPicture Picture2.Picture, 0, 0
'Printer.EndDoc
'Sustitúyelas por lo siguiente :
'Printer.Print ""
'Printer.PaintPicture Picture2.Picture, 0, 0, , , _
00, , Picture2.Height / 2
'Printer.NewPage
'Printer.PaintPicture Picture2.Picture, 0, 0, , , _
0, Picture2.Height / 2, , Picture2.Height / 2
'Printer.EndDoc
'Este código divide el formulario en dos partes a modo de ejemplo.
'Puedes ajustar la región de corte a tus necesidades.
'NOTA: La ayuda en línea de Visual Basic 6.0 dice que PrintForm imprime el formulario entero,
'incluso si no está visible por completo. Esta información es errónea.
'Fuente: http://www.telecable.es/personales/jrub ... trucos.htm

1 comentario:

  1. amigo con printform quiero imprimir un formulario que simula un ticket. Posee label con datos y una grilla que es el detalle de venta. La grilla y el formulario tienen autosize por ende se amoldan a la cantidad de filas del detalle. Cuando mando a imprimir uso el print(this, Scrollable) y nada todo de 10. El tema es que cuando el formulario es mas largo que la pantalla solo me imprime el area visible. Ahora bien si antes de imprimir mueve con el mouse el formulario y despues doy al boton imprimir lo imprime perfecto por mas que el formulario supere la pantalla. Me explico ?
    Estuve investigando y resulta que el formulario no es el problema sino la grilla, ya que ella es la que se corta en el area visible del monitor si es que no muevo el formulario con el mouse antes.
    Ahora mi pregunta es existe forma de simular despues de la carga ese movimiento con el mouse o un metodo-propiedad-evento de la grilla o formulario que me permita no tener que moverlo de antemano con el mouse.
    Desde ya mil gracias

    ResponderEliminar

Dejanos la consulta sobre tu código, y con gusto a la mayor brevedad posible te responderemos...