Imprimir con richtextbox
Resuelto
danmor
Mensajes publicados
31
Estado
Miembro
-
arion320 Mensajes publicados 219 Fecha de registro Estado Miembro Última intervención -
arion320 Mensajes publicados 219 Fecha de registro Estado Miembro Última intervención -
Hola, a todos
Buen comienzo de año
Yo empiezo bien con esta pregunta
¿Alguien tiene una buena manera de imprimir con vb 2005? He intentado muchas cosas, pero no hay forma.
Siempre hay un error en alguna parte que no encuentro. ¿Tienen alguna buena forma que funcione bien? Si pueden ayudarme, sería amable.
¡Hasta luego!
Buen comienzo de año
Yo empiezo bien con esta pregunta
¿Alguien tiene una buena manera de imprimir con vb 2005? He intentado muchas cosas, pero no hay forma.
Siempre hay un error en alguna parte que no encuentro. ¿Tienen alguna buena forma que funcione bien? Si pueden ayudarme, sería amable.
¡Hasta luego!
Configuración: Windows XP Internet Explorer 7.0
2 respuestas
-
Hola,
1.
Crea una clase RichTextBoxPrintCtrl que herede de RichTextBox.
2.
Utiliza la clase RichTextBoxPrintCtrl en tu proyecto actualizado.
Para crear una clase que herede de la clase RichTextBox
1.
Usa Visual Basic 2005 para crear un nuevo proyecto Biblioteca de clases llamado RichTextBoxPrintCtrl.
Por defecto, se crea Class1.vb.
2.
Cambia el nombre del archivo Class1.vb a RichTextBoxPrintCtrl.vb.
3.
En el Explorador de soluciones, haz clic derecho en Referencias, y luego haz clic en Agregar referencia.
4.
En el cuadro de diálogo Agregar referencia, haz doble clic en System.Drawing.dll, y luego en System.Windows.Forms.dll.
5.
Para agregar las referencias, haz clic en Aceptar.
6.
Elimina el código existente en RichTextBoxPrintCtrl.vb.
7.
Agrega el siguiente código 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
' Convierte la unidad que utiliza el marco .NET
' (1/100 pulgada) y la unidad que se utiliza en llamadas a la API Win32
' (twips 1/1440 pulgada)
Private Const AnInch As Double = 14.4
Private WithEvents m_PrintDocument As Printing.PrintDocument
Private intCharactersToPrint As Integer
Private intCurrentPosition As Integer
<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
' Primer carácter de la gama (0 para el inicio del documento)
Public cpMin As Integer
' Último carácter de la gama (-1 para el final del documento)
Public cpMax As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure FORMATRANGE
' DC real para dibujar
Public hdc As IntPtr
' DC objetivo para determinar el formato del texto
Public hdcTarget As IntPtr
' Región del DC a la que dibujar (en twips)
Public rc As Rect
' Región de todo el DC (tamaño de página) (en twips)
Public rcPage As Rect
' Rango de texto a dibujar (ver declaración anterior)
Public chrg As CHARRANGE
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
Public Sub SelPrint()
' Imprimir solo el texto seleccionado si hay uno seleccionado
If Me.SelectionLength > 0 Then
intCharactersToPrint = Me.SelectionStart + Me.SelectionLength
intCurrentPosition = Me.SelectionStart
Else
' De lo contrario, imprime todo el documento
intCharactersToPrint = Me.TextLength
intCurrentPosition = 0
End If
m_PrintDocument.Print()
End Sub
' Renderiza el contenido del RichTextBox para imprimir
' Devuelve el último carácter impreso + 1 (la impresión comienza desde
' este punto para la siguiente página)
Private Function Print(ByVal charFrom As Integer, _
ByVal charTo As Integer, ByVal e As PrintPageEventArgs) As Integer
' Marca el carácter de inicio y de fin
Dim cRange As CHARRANGE
cRange.cpMin = charFrom
cRange.cpMax = charTo
' Calcula el área a renderizar 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
' Calcula 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
' Indica el carácter desde el que hasta el carácter
fmtRange.chrg = cRange
' Usa el mismo DC para medir y renderizar
fmtRange.hdc = hdc
' Apunta al hDC de la impresora
fmtRange.hdcTarget = hdc
' Indica el área en la página para imprimir
fmtRange.rc = rectToPrint
' Indica el tamaño total de la página
fmtRange.rcPage = rectPage
Dim res As IntPtr = IntPtr.Zero
Dim wparam As IntPtr = IntPtr.Zero
wparam = New IntPtr(1)
' Mueve 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)
' Envía los datos renderizados para imprimir
res = _
SendMessage(Handle, EM_FORMATRANGE, wparam, lparam)
' Libera el bloque de memoria asignado
Marshal.FreeCoTaskMem(lparam)
' Libera el controlador del contexto del dispositivo obtenido por una
' llamada previa
e.Graphics.ReleaseHdc(hdc)
' devuelve el último carácter impreso + 1
Return res.ToInt32
End Function
Public ReadOnly Property PrintDocument() As Printing.PrintDocument
Get
If m_PrintDocument Is Nothing Then
m_PrintDocument = New Printing.PrintDocument
End If
Return m_PrintDocument
End Get
End Property
Private Sub m_PrintDocument_PrintPage(ByVal sender As _
Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles m_PrintDocument.PrintPage
' Imprime el contenido del RichTextBox.
' Almacena el último carácter impreso.
intCurrentPosition = Me.Print(intCurrentPosition, _
intCharactersToPrint, e)
' Busca más páginas comprobando
If intCurrentPosition < intCharactersToPrint Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub
End Class
End Namespace
8.
Para crear RichTextBoxPrintCtrl.dll, haz clic en Generar solución en el menú Generar.
Para usar la clase RichTextBoxPrintCtrl en tu proyecto actualizado
1.
Abre tu proyecto de aplicación de Windows actualizado en Visual Basic 2005.
2.
Desde la caja de herramientas, arrastra un componente PrintDialog al formulario que contiene el control RichTextBox.
3.
En el menú Herramientas, haz clic en Personalizar la caja de herramientas.
4.
Haz clic en Componentes de .NET Framework, en Examinar, selecciona RichTextBoxPrintCtrl.dll, y luego haz clic en Aceptar.
5.
Desde la caja de herramientas, arrastra un control RichTextBoxPrintCtrl al formulario.
6.
Define las propiedades de RichTextBoxPrintCtrl para que coincidan con las propiedades de tu control RichTextBox original.
7.
Elimina el control RichTextBox, y luego renombra el control RichTextBoxPrintCtrl para que tenga el mismo nombre que tu control RichTextBox original.
8.
Haz doble clic en el formulario para abrir el editor de código.
9.
Agrega el siguiente código al manejador del evento Button_Click (o donde sea que hayas llamado a SelPrint en el código original):
' NOTA: Reemplaza "Button1" con el nombre de tu botón de impresión real
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' asocia el documento de impresión correcto al cuadro de diálogo de impresión
PrintDialog1.Document = Me.RichTextBoxPrintCtrl1.PrintDocument
If PrintDialog1.ShowDialog() = DialogResult.OK Then
Me.RichTextBoxPrintCtrl1.SelPrint()
End If
End Sub-
Bravo el Copiar/Pegar del sitio oficial de Microsoft. Solo tenías que dar el enlace:
* https://docs.microsoft.com/fr-fr/previous-versions/7d29f66t(v=vs.90)?redirectedfrom=MSDN
-
-
Gracias, pero aquí recibo directamente un error de violación de impresora
Ya tengo esta dll efectiva en otro de mis proyectos y es el mismo problema
Gracias por tu ayuda, pero tendré que verificar todos mis programas que utilizan una impresora y ver cuál es el problema, y gracias de nuevo.