Você está na página 1de 5

Crear un control RichTextBoxPrintCtrl: PARA IMPRIMIR

Para extender la clase RichTextBox y usar EM_FORMATRANGE para imprimir el


contenido de un control RichTextBox, siga estos pasos:

1. Use Microsoft Visual Basic .NET o Microsoft Visual Basic 2005 para crear un
nuevo proyecto de biblioteca de clases denominado RichTextBoxPrintCtrl.

De forma predeterminada se crea Class1.vb.


2. Cambie el nombre del archivo Class1.vb a RichTextBoxPrintCtrl.vb.
3. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón)
en Referencias y, después, haga clic en Agregar referencia.
4. En el cuadro de diálogo Agregar referencia, haga doble clic en
System.Drawing.dll y en System.Windows.Forms.dll.
5. Para agregar referencias, haga clic en Aceptar.
6. Elimine el código existente en RichTextBoxPrintCtrl.vb.
7. Copie el código siguiente a RichTextBoxPrintCtrl.vb:

Option Explicit On

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Drawing.Printing

Namespace RichTextBoxPrintCtrl
Public Class RichTextBoxPrintCtrl
Inherits RichTextBox
' Convertir la unidad que usa .NET framework (1/100 de pulgada)
' y la unidad que usan las llamadas a la API Win32 (twips 1/1440
de pulgada)

Private Const AnInch As Double = 14.4

<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential)> _
Private Structure CHARRANGE

Public cpMin As Integer


' Primer caracter del intervalo (0 para el principio del
documento )
Public cpMax As Integer
' Último carácter del intervalo (-1 para el final del
documento)
End Structure

<StructLayout(LayoutKind.Sequential)> _
Private Structure FORMATRANGE

Public hdc As IntPtr


' DC real en el que dibujar
Public hdcTarget As IntPtr
' DC de destino para determinar el formato de texto
Public rc As RECT
' Región del DC para dibujar (en twips)
Public rcPage As RECT
' Zona de todo el DC (tamaño de la página) (en twips)
Public chrg As CHARRANGE
' Intervalo del texto para dibujar (vea la declaración
anterior)
End Structure

Private Const WM_USER As Integer = &H400


Private Const EM_FORMATRANGE As Integer = WM_USER + 57

Private Declare Function SendMessage Lib "USER32" Alias


"SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As
IntPtr, ByVal lp As IntPtr) As IntPtr

' Procesar el contenido del RichTextBox para imprimir


' Devolver el último carácter impreso + 1 (la impresión empieza
desde este punto para la siguiente página)
Public Function Print(ByVal charFrom As Integer, ByVal charTo As
Integer, ByVal e As PrintPageEventArgs) As Integer

' Marcar el carácter inicial y final


Dim cRange As CHARRANGE
cRange.cpMin = charFrom
cRange.cpMax = charTo

' Calcular el área que procesar e imprimir


Dim rectToPrint As RECT
rectToPrint.Top = e.MarginBounds.Top * AnInch
rectToPrint.Bottom = e.MarginBounds.Bottom * AnInch
rectToPrint.Left = e.MarginBounds.Left * AnInch
rectToPrint.Right = e.MarginBounds.Right * AnInch

' Calcular el tamaño de la página


Dim rectPage As RECT
rectPage.Top = e.PageBounds.Top * AnInch
rectPage.Bottom = e.PageBounds.Bottom * AnInch
rectPage.Left = e.PageBounds.Left * AnInch
rectPage.Right = e.PageBounds.Right * AnInch

Dim hdc As IntPtr = e.Graphics.GetHdc()


Dim fmtRange As FORMATRANGE
fmtRange.chrg = cRange
' Indicar carácter desde y hasta
fmtRange.hdc = hdc
' Usar el mismo DC para medir y procesar
fmtRange.hdcTarget = hdc
' Señalar a la impresora hDC
fmtRange.rc = rectToPrint
' Indicar el área de la página que imprimir
fmtRange.rcPage = rectPage
' Indicar todo el tamaño de la página

Dim res As IntPtr = IntPtr.Zero

Dim wparam As IntPtr = IntPtr.Zero


wparam = New IntPtr(1)

' Mover el puntero a la estructura FORMATRANGE en la memoria


Dim lparam As IntPtr = IntPtr.Zero
lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange))
Marshal.StructureToPtr(fmtRange, lparam, False)

' Enviar los datos procesados para imprimir


res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam)

' Liberar el bloque de memoria asignada


Marshal.FreeCoTaskMem(lparam)

' Liberar el identificador del contexto de dispositivo


obtenido en una llamada anterior .Graphics.ReleaseHdc(hdc)

' Devolver la impresora con el último carácter + 1

Return res.ToInt32()
End Function

End Class
End Namespace

8. Para crear RichTextBoxPrintCtrl.dll, haga clic en Generar solución en el menú Generar.

Probar el control

Para probar el control, siga estos pasos:

1. Cree un nuevo proyecto de aplicación Windows con Visual Basic .NET o Visual Basic 2005.

De manera predeterminada se creará Form1.vb.


2. En el cuadro de herramientas, arrastre un botón a Form1. Cambie el nombre a
btnPageSetup y cambie el texto a Configuración de página.
3. En el cuadro de herramientas, arrastre otro botón a Form1. Cambie el nombre a
btnPrintPreview y cambie el texto a Vista preliminar.
4. En el cuadro de herramientas, arrastre otro botón a Form1. Cambie el nombre a btnPrint y
cambie el texto a Imprimir.
5. En el cuadro de herramientas, haga doble clic en PrintDialog, PrintPreviewDialog,
PrintDocument y PageSetupDialog para agregar estos controles a Form1.
6. Modifique la propiedad Document de PrintDialog1, PrintPreviewDialog1 y
PageSetupDialog1 por PrintDocument1.
7. En el menú Herramientas, haga clic en Personalizar cuadro de herramientas.
8. Haga clic en Componentes de .NET Framework, haga clic en Examinar, active
RichTextBoxPrintCtrl.dll y, después, haga clic en Aceptar.
9. En el cuadro de herramientas, arrastre RichTextBoxPrintCtrl a Form1.
10. En el Explorador de soluciones, haga clic con el botón secundario del mouse en Form1.vb
y, a continuación, haga clic en Ver código.
11. Agregue el código siguiente a la clase Form1:

Public Class Form1

Private checkPrint As Integer

Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e


As System.Drawing.Printing.PrintEventArgs) Handles
PrintDocument1.BeginPrint

checkPrint = 0

End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e


As System.Drawing.Printing.PrintPageEventArgs) Handles
PrintDocument1.PrintPage

' Imprimir el contenido del RichTextBox. Almacenar el último


carácter impreso.

checkPrint = RichTextBoxPrintCtrl1.Print(checkPrint,
RichTextBoxPrintCtrl1.TextLength, e)

' Buscar más páginas

If checkPrint < RichTextBoxPrintCtrl1.TextLength Then

e.HasMorePages = True
Else

e.HasMorePages = False
End If

End Sub
Private Sub btnconfiguracionpagina_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
btnconfiguracionpagina.Click

PageSetupDialog1.ShowDialog()

End Sub

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnimprimir.Click

If PrintDialog1.ShowDialog() = DialogResult.OK Then

PrintDocument1.Print()

End If

End Sub

Private Sub btnvistapreliminar_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles btnvistapreliminar.Click

PrintPreviewDialog1.ShowDialog()

End Sub

End Class

12. Para ejecutar la aplicación, en el menú Depurar, haga clic en Iniciar.


13. Escriba texto en RichTextBoxPrintCtrl.
14. Para establecer la configuración de la página, haga clic en Configuración de página.
15. Para ver una vista preliminar de la página, haga clic en Vista preliminar.
16. Para imprimir el contenido del RichTextBoxPrintCtrl, haga clic en Imprimir.

Você também pode gostar