none
Imprimir un panel RRS feed

  • Pregunta

  • Hola hola!!!

    Tengo una duda, que no consigo resolver, ¿es posible imprimir un panel? 

    Me explico, tengo un Form que contiene dos paneles y quiero imprimir solo uno de ellos. Sabría hacerlo copiando ese panel a un nuevo Form e imprimiendolo, pero... podría hacerlo directamente desde el panel?? 

    Espero vuestras respuestas para ver la luz!!!


    miércoles, 15 de noviembre de 2017 8:55

Respuestas

  • Puedes usar esta clase:

    Private Sub ImprimirPanel(ByVal panel As Panel)
    
        Dim pd As New ImpresorPanel(panel)
    
        Dim pvw As New PrintPreviewDialog()
    
        pvw.Document = pd
    
        pvw.ShowDialog() ' << Si no quieres vista previa cambia esta línea por  pd.Print()
    
    End Sub
    
    
    Public Class ImpresorPanel
        Inherits PrintDocument
    
        Private _panel As Panel
    
        Public Sub New(ByVal panel As Panel)
    
            _panel = panel
    
        End Sub
    
        Public ReadOnly Property Panel() As Panel
    
            Get
    
                Return _panel
    
            End Get
    
        End Property
    
    
    
        Protected Overrides Sub OnPrintPage(ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    
            MyBase.OnPrintPage(e)
    
            Dim rect As Rectangle = Me.Panel.ClientRectangle
    
            Dim bmp As New Bitmap(rect.Width, rect.Height)
    
            Me.Panel.DrawToBitmap(bmp, rect)
    
            e.Graphics.DrawImage(bmp, 0, 0)
    
        End Sub
    
    End Class


    Saludos, Javier J

    miércoles, 15 de noviembre de 2017 9:12

Todas las respuestas

  • Puedes usar esta clase:

    Private Sub ImprimirPanel(ByVal panel As Panel)
    
        Dim pd As New ImpresorPanel(panel)
    
        Dim pvw As New PrintPreviewDialog()
    
        pvw.Document = pd
    
        pvw.ShowDialog() ' << Si no quieres vista previa cambia esta línea por  pd.Print()
    
    End Sub
    
    
    Public Class ImpresorPanel
        Inherits PrintDocument
    
        Private _panel As Panel
    
        Public Sub New(ByVal panel As Panel)
    
            _panel = panel
    
        End Sub
    
        Public ReadOnly Property Panel() As Panel
    
            Get
    
                Return _panel
    
            End Get
    
        End Property
    
    
    
        Protected Overrides Sub OnPrintPage(ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    
            MyBase.OnPrintPage(e)
    
            Dim rect As Rectangle = Me.Panel.ClientRectangle
    
            Dim bmp As New Bitmap(rect.Width, rect.Height)
    
            Me.Panel.DrawToBitmap(bmp, rect)
    
            e.Graphics.DrawImage(bmp, 0, 0)
    
        End Sub
    
    End Class


    Saludos, Javier J

    miércoles, 15 de noviembre de 2017 9:12
  • Muchas gracias por tu respuesta, pero la verdad... es que me entero de poco...

    Lo primero es que entiendo que en alguno de los muchos "panel" que hay en el codigo te refieres al nombre del panel en concreto, pero no tengo claro en cuales.

    pvw.Document = pd         me da error el pd, y si, esta declarado como variable

    Entiendo que el class lo tengo que sacar fuera del anterior class (soy novato en esto de la programación)

    Printdocument lo cambio por printdocument1 (como lo nombra Visual studio)

    Y ya en el Protected Overrides me da muchos mas errores.

    Lo he dejado así

        Private Sub ImprimirPanel(ByVal PanResumFacAño As Panel)
            Dim pd As New ImpresorPanel(PanResumFacAño)
            Dim pvw As New PrintPreviewDialog()
            pvw.Document = pd
            pvw.ShowDialog() ' << Si no quieres vista previa cambia esta línea por  pd.Print()
        End Sub

    End Class

    Public Class ImpresorPanel
        Inherits PrintDocument1
        Private PanResumFacAño As Panel
        Public Sub New(ByVal panel As Panel)
            PanResumFacAño = panel
        End Sub
        Public ReadOnly Property Panel() As Panel
            Get
                Return PanResumFacAño
            End Get
        End Property

        Protected Overrides Sub OnPrintPage(ByVal e As System.Drawing.Printing.PrintPageEventArgs)
            MyBase.OnPrintPage(e)
            Dim rect As Rectangle = Me.Panel.ClientRectangle
            Dim bmp As New Bitmap(rect.Width, rect.Height)
            Me.Panel.DrawToBitmap(bmp, rect)
            e.Graphics.DrawImage(bmp, 0, 0)
        End Sub
    End Class

    miércoles, 15 de noviembre de 2017 9:25
  • No tienes que cambiar el código. Agrega una clase y ponle el código de   Class ImpresorPanel 

    Tienes que importar System.Drawing.Printing

    A ImpresorPanel le pasas como parámetro el panel que quieras imprimir.


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio viernes, 17 de noviembre de 2017 17:18
    miércoles, 15 de noviembre de 2017 9:46
  • Esto va mejorando, al importar el system.Drawing.Printing se me van la mayotia de errores, pero se me mantienen en

     Protected Overrides Sub OnPrintPage(ByVal e As System.Drawing.Printing.PrintPageEventArgs)
            MyBase.OnPrintPage(e)
            Dim rect As Rectangle = Me.Panel.ClientRectangle
            Dim bmp As New Bitmap(rect.Width, rect.Height)
            Me.Panel.DrawToBitmap(bmp, rect)
            e.Graphics.DrawImage(bmp, 0, 0)
        End Sub

    me da error en "Me.Panel.ClientRectangle"

    "Dim bmp As New Bitmap(rect.Width, rect.Height)" en el Bitmap

    "Me.Panel.DrawToBitmap(bmp, rect)" en el rect

    • Propuesto como respuesta Pablo Rubio viernes, 17 de noviembre de 2017 17:18
    miércoles, 15 de noviembre de 2017 9:57
  • Por cierto, si es de ayuda, tengo importado el Microsoft.Office.Interop.Excel.

    Y en Dim Rect As Rectangle, Rectangle me lo reconoce como Interface Microsoft.Office.Interop.Excel.Rectangle

    Podría estar ahí el problema?

    miércoles, 15 de noviembre de 2017 10:08
  • SIIIIIII

    Ahí estaba el problema!!! Muchas gracias por tu tiempo!!!!!!

    miércoles, 15 de noviembre de 2017 10:10