Argentina
Mapa del sitio  | Home | Worldwide
Microsoft
Buscar en Microsoft.com:
Ayuda y Soporte Técnico  
| Seleccione un producto | Búsqueda Avanzada | Grupos de noticias | Contáctenos

Cómo imprimir el contenido de un control RichTextBox utilizando Visual Basic .NET o Visual Basic 2005

Id. de artículo : 811401
Última revisión : martes, 03 de octubre de 2006
Versión : 5.3
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.

Volver al principio

Crear un control RichTextBoxPrintCtrl

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.

Volver al principio

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:
  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.

Volver al principio

Referencias

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):
Clase RichTextBox
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsRichTextBoxClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsRichTextBoxClassTopic.asp)

Volver al principio


La información de este artículo se refiere a:
Microsoft Visual Basic 2005
Microsoft Visual Basic .NET 2003 Standard Edition
Microsoft Visual Basic .NET 2002 Standard Edition

Volver al principio

Palabras clave: 
kbhowto kbhowtomaster kbwindowsforms kbprint kbctrl kbcontrol kbinheritance kbvs2005applies kbvs2005swept KB811401

Volver al principio

 

Buscar en

 
Búsqueda Avanzada

Seleccione idioma

 

Más soporte técnico

Herramientas


©2007 Microsoft Corporation. Todos los derechos reservados. Aviso legal |Marcas registradas |Privacidad