Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/12/2005, 04:12
yaviz
 
Fecha de Ingreso: diciembre-2004
Mensajes: 371
Antigüedad: 19 años, 4 meses
Puntos: 0
por si a alguien le sirve encontre esto




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.

MAS INFORMACION
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.

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.

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& ' Draw the window's client area.
Private Const PRF_CHILDREN = &H10& ' Draw all visible child windows.
Private Const PRF_OWNED = &H20& ' Draw all owned windows.

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 ' default
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.hDC, 0)
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.Picture, 0, 0
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, , , _
0, 0, , 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.