Imprimir con richtextbox

Resuelto
danmor Mensajes publicados 31 Estado Miembro -  
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!
Configuración: Windows XP Internet Explorer 7.0

2 respuestas

  1. Nico# Mensajes publicados 328 Fecha de registro   Estado Miembro Última intervención   102
     
    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
    0
  2. danmor Mensajes publicados 31 Estado Miembro
     
    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.
    0
    1. chiffre
       
      Gracias por estos detalles para imprimir..

      Esto funciona muy bien, me quedan algunos códigos por añadir...

      Gracias
      número
      0