Para obtener una versión de este artículo para
Microsoft Visual Basic 6.0, vea 146022 (http://support.microsoft.com/kb/146022/).
Para obtener una versión de este artículo para
Microsoft Visual C# .NET, vea 812425 (http://support.microsoft.com/kb/812425/).
En esta página
Resumen
En este artículo paso a paso se describe cómo
imprimir el contenido de un control RichTextBox. El control
RichTextBox no proporciona un método para imprimir su
contenido. Sin embargo, puede extender la clase RichTextBox
para usar el mensaje EM_FORMATRANGE. Entonces puede enviar el
contenido de un RichTextBox a un dispositivo de salida, por
ejemplo, a una impresora.
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.
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:
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 btnPageSetup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPageSetup.Click.Click PageSetupDialog1.ShowDialog() End Sub
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click If PrintDialog1.ShowDialog() = DialogResult.OK Then PrintDocument1.Print() End If End Sub
Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click PrintPreviewDialog1.ShowDialog() End Sub
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.
Para obtener más información, consulte la
documentación del Kit de desarrollo de software (SDK) de Microsoft
.NET Framework o el sitio Web de Ayuda en línea de MSN siguiente
(pueden estar en inglés):