IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Impression Table Layout Panel et son contenu


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut Impression Table Layout Panel et son contenu
    Bonjour,

    Je souhaite après un click sur un bouton imprimer un Table Layout Panel et son contenu. Le tout qui tienne sur une page (il faut le redimensionner pour qu'il tienne sur une seule page) en orientation portrait. Je souhaite également pouvoir sélectionner mon imprimante.

    J'ai parcouru le forum de nombreux post traitent ce problème, seulement le fait d'être débutant ainsi que le manque d'indications (ou explications) m'empêchent de l'adapter à mon cas, je consulte également le tutoriel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://bidou.developpez.com/tutoriels/dotnet/impression/
    mais le code est peu commenté et je ne vois pas comment faire. J'ai néanmoins commencé à réalisé un bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports System.Drawing.Printing
    Imports System.IO
     
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Dim doc As New PrintDocument
            Dim PageSetup As New PageSetupDialog
     
            Me.PrintDocument1.DefaultPageSettings.Landscape = True
            Me.PrintDocument1.OriginAtMargins = True
            Me.PrintPreviewDialog1.ShowDialog(Me)
        End Sub
     
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim XPos, YPos As Single
            Dim ChaineImpr As String
            Using MyGr As Graphics = e.Graphics
     
            End Using
        End Sub
    Mon form possède un Printdocument et un printpreviewdialog

    Merci par avance de votre aide
    Bonne journée,

    Cordialement,

    Vincent

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    Le cours de Ph. Lasserre et particulièrement la partie impression explique très bien cela.

    pour spécifier l'imprimante dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                pd.PrinterSettings().PrinterName = strPrinter
                pd.DefaultPageSettings.PaperSource = _
                pd.PrinterSettings.PaperSources.Item(iIndexBacJaune)
    et en dehors du code, voir la partie du cours consacré

    Si vous avez une question précise, n'hésitez pas.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Bonjour Sankasssss,

    Merci pour ta réponse, il est indéniable que le cours de Ph. Lasserre est excellent. Cependant la partie impression, je m'excuse laisse à désirer ... Toutefois le conseil indiqué :

    Prévoir une longue soirée, au calme, un bon siège, 1 g de paracétamol et un gros thermos de café!!
    est tout à fait pertinent et censé

    En effet simple débutant je n'y comprends rien, le code n'est ni commenté ni expliqué comment s'y retrouver ?

    A l'heure actuelle j'ai réalisé un gros programme très performant qui fonctionne très bien et ce grâce au cours de Ph. Lasserre.

    Des questions précises ? Très bien :

    Comment je récupère mon TableLayoutPanel5 pour l'imprimer ?
    Comment je le redimensionne pour qu'il tienne sur une page ?

    Pour ce qui est du choix de l'imprimante, je vais passer par un PrintDialog1 :

    Comment je valide l'impression ?


    Voici mes trois questions qui actuellement me bloquent dans la finalisation de mon programme. J'ai beau chercher sur le forum et dans les tutoriels je n'arrive pas à comprendre la logique et le code de l'impression.

    Merci d'avance de bien vouloir m'aider, (je ne souhaite pas que l'on fasse à ma place je veux apprendre je veux que l'on m'explique pour que je puisse réaliser)
    Bonne journée,

    Cordialement,

    Vincent

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    toncontrol.DrawToBitmap (fournir un system.Drawing.bitmap créé avec la surcharge du new qui demande width et height je pense, le rectangle qui va avec je pense ou toncontrol.clientrectangle (à tester))
    puis e.Graphics.Drawimage(le bitmap, destrect, sourcerect etc...)

    la surcharge de drawimage demande destrect et sourcerect permet le redimensionnement
    le destrect est à créer à partir de printablearea ou bounds (à tester aussi)
    le sourcerect est 0,0,bitmap.width, bitmap.height

    voir avec les dpi et les units si l'image est moche à l'impression, car l'écran est en 96 dpi, et du 96dpi imprimé c'est pas top donc redimensionné c'est peut etre pire

    il faut en effet un peu de paracétamol tellement ces classes sont peu pratiques (par exemple des pagessettings qui se retrouvent sur plusieurs classes, rien n'est intuitif etc...)


    NB : dans l'event printpage, si on met e.hasmorepages = true, à la sortie de l'event celui ci est redéclenché, ca permet de faire une impression sur plusieurs pages, par contre vu qu'on tombe dans la même méthode le code est chiant à écrire (d'où le paracétamol une fois de plus) et peut devenir illisible (paracétamol si relecture plusieurs mois plus tard)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Using MyGr As Graphics = e.Graphics
     
    End Using
    retire ce using, il est plus destructeur qu'utile, si un évènement te donne une variable ce n'est pas à toi de la détruire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour Vincent32...
    Comme dis par Pol63 ,tu dois utiliser Control.DrawToBitmap (de ton TableLayoutPanell)....
    Maintenant la resolution d'image generee est de 96 dpi "logiques" ..pas fameux....
    code exemple avec un TableLayoutPanel avec gestion des marges....à remplir avec des controles par tes soins....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    '- ajoute pour tester l'exemple:
    '- un bouton ApercuImp
    '- un TableLayoutPanel1  sur le WinForm 
    '- PrintDocument
    '- PrintPreviewDialog
    Imports System.Drawing.Printing
    Public Class frmPrintTableLayoutPanel
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            btnApercuImp.Dock = DockStyle.Top
            ' Un simple control TableLayoutPanel que j'ai rempli avec d'autres controls
            ' Dock en fill et positionne en dessous du bouton
            Me.TableLayoutPanel1.Dock = DockStyle.Fill
            'Maximize la taille du form
            Me.WindowState = FormWindowState.Maximized
        End Sub
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim MyGr As Graphics = e.Graphics
            'Met PageUnit à Display (apercu conforme à sortie printer)
            MyGr.PageUnit = GraphicsUnit.Display
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
     
            'Envoie TableLayoutPanel dans un bitmap avec Control.DrawToBitmap
            Dim memoryImagePanel = New Bitmap(Me.TableLayoutPanel1.Bounds.Width, Me.TableLayoutPanel1.Bounds.Height, MyGr)
            Me.TableLayoutPanel1.DrawToBitmap(memoryImagePanel, Me.TableLayoutPanel1.Bounds)
     
            'code .net managed qui recopie l'image en gardant les proportions 
            'rect source =>memoryImagePanel 
            Dim RectSource As RectangleF = New Rectangle(0, 0, memoryImagePanel.Width, memoryImagePanel.Height)
            'definit les "marges" diaboliques
            Dim myMargin As Margins = New Margins(20, 20, 20, 20)
            'les assignes à  PrintDocument1
            PrintDocument1.DefaultPageSettings.Margins = myMargin
     
            'rect destination c'est notre format de page choisi par user (A4,A3 etc...)
            'il se trouve dans e.MarginBounds que nous avons personnalise cette fois
            Dim RectDest As RectangleF = e.MarginBounds
     
            'surcharge de DrawImage qui recopie l'image en gardant les proportions 
            MyGr.DrawImage(memoryImagePanel, RectDest, RectSource, GraphicsUnit.Pixel)
     
        End Sub
     
        Private Sub btnApercuImp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnApercuImp.Click
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.ShowDialog()
        End Sub
    End Class
    bon code............

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Je travaille encore dessus, j'essaye par moi même et si j'ai plus de questions je reviens vers vous.

    Mon problème majeur à l'heure actuelle est que le table Layout est plus grand que l'écran (scroll bar latérale et verticale) or il ne m'imprime que la partie visible à l'écran et non toute ma table layout

    Je regarde le code et j'essaye le code fourni page 50 de ce document :

    http://bidou.developpez.com/tutoriel...et/impression/

    Si vraiement je bloque je reviens vous voir

    En tout cas merci beaucoup pour les solutions apportées et le code commenté !
    Bonne journée,

    Cordialement,

    Vincent

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Bon je bloque toujours malgré plusieurs essais.

    Voici les difficultés que je rencontre :

    -Je ne veux pas imprimer la première et la dernière colonne de mon table Layout Panel ni la dernière ligne (impression de la colonne 2 à 12 et de la ligne 1 à 21)

    -Si tout ne rentre pas sur l'écran j'ai des scrollsbar qui apparaissent. Je veux pouvoir imprimer ce qui n'apparait pas sur l'écran et qui est contenu dans mon table layout panel (et si des scroll bar apparaissent à l'écran je ne veux pas que ces dernières s'impriment)

    Auriez vous des suggestions et/ou solutions à m'apporter

    Merci d'avance de votre aide
    Bonne journée,

    Cordialement,

    Vincent

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour Vincent32
    comme tu ne fournis pas ton code à probleme ,il est difficile de repondre ...

    Le code dela donne imprime les limites reelles ou "bounds" du TableLayoutPanel y compris les non-visbles à l'ecran.
    Pour ne pas imprimer une ligne ou colonne particuliere donne-lui une hauteur ou largeur nulle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       'ligne 3
            Me.TableLayoutPanel1.RowStyles(2).SizeType = SizeType.Absolute
            Me.TableLayoutPanel1.RowStyles(2).Height = 0.0
            'colonne 6
            Me.TableLayoutPanel1.ColumnStyles(5).SizeType = SizeType.Absolute
            Me.TableLayoutPanel1.ColumnStyles(5).Width = 0.0
    bon code.........

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    bonjour,

    Merci de ton aide MABROUKI,

    Voici le code que j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
      Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
     
            Dim MyGr As Graphics = e.Graphics
            'Met PageUnit à Display (apercu conforme à sortie printer)
            MyGr.PageUnit = GraphicsUnit.Display
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            MyGr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
     
            Me.TableLayoutPanel5.Dock = DockStyle.None
     
     
     
     
     
     
            'ligne 22
            Me.TableLayoutPanel5.RowStyles(21).SizeType = SizeType.Absolute
            Me.TableLayoutPanel5.RowStyles(21).Height = 0.0
            'colonne 1
            Me.TableLayoutPanel5.ColumnStyles(0).SizeType = SizeType.Absolute
            Me.TableLayoutPanel5.ColumnStyles(0).Width = 0.0
            'colonne 13
            Me.TableLayoutPanel5.ColumnStyles(12).SizeType = SizeType.Absolute
            Me.TableLayoutPanel5.ColumnStyles(12).Width = 0.0
     
            Me.TableLayoutPanel5.AutoSize = True
     
            Me.TableLayoutPanel5.Anchor = AnchorStyles.Bottom
            Me.TableLayoutPanel5.Anchor = AnchorStyles.Left
            Me.TableLayoutPanel5.Anchor = AnchorStyles.Right
            Me.TableLayoutPanel5.Anchor = AnchorStyles.Top
     
            'Envoie TableLayoutPanel dans un bitmap avec Control.DrawToBitmap
            Dim memoryImagePanel = New Bitmap(Me.TableLayoutPanel5.Bounds.Width, Me.TableLayoutPanel5.Bounds.Height, MyGr)
            Me.TableLayoutPanel5.DrawToBitmap(memoryImagePanel, Me.TableLayoutPanel5.Bounds)
     
            'code .net managed qui recopie l'image en gardant les proportions 
            'rect source =>memoryImagePanel 
            Dim RectSource As RectangleF = New Rectangle(0, 0, memoryImagePanel.Width, memoryImagePanel.Height)
            'definit les "marges" diaboliques
            Dim myMargin As Margins = New Margins(20, 20, 20, 20)
            'les assignes à  PrintDocument1
            PrintDocument1.DefaultPageSettings.Margins = myMargin
     
            'rect destination c'est notre format de page choisi par user (A4,A3 etc...)
            'il se trouve dans e.MarginBounds que nous avons personnalise cette fois
            Dim RectDest As RectangleF = e.MarginBounds
     
            'surcharge de DrawImage qui recopie l'image en gardant les proportions 
            MyGr.DrawImage(memoryImagePanel, RectDest, RectSource, GraphicsUnit.Pixel)
     
     
     
     
     
     
     
     
        End Sub
     
        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Me.PrintDocument1.DefaultPageSettings.Landscape = True
            PrintDialog1.ShowDialog()
            PrintDialog1.Document = PrintDocument1
            PrintDocument1.Print()
        End Sub

    actuellement il semble tourner correctement au détail près que lorsque je lance l'impression :

    -la boit de dialogue impression s'ouvre (choix des différentes imprimantes, préférences nombre de copies).

    puis le message d'erreur suivant apparait :

    L'exception ArgumentException n'a pas été gérée
    en dessous : targetBounds

    avec la ligne suivante surlignée en jaune

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.TableLayoutPanel5.DrawToBitmap(memoryImagePanel, Me.TableLayoutPanel5.Bounds)
    Bonne journée,

    Cordialement,

    Vincent

  10. #10
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    salut Vincent32
    Ca ne serait pas un probleme de HardMargin ou marge "dure"' d'imprimante incompatible avec les margins de l'exemple.

    Les marges "dures" sont les marges acceptables par l'imprimante,on ne peut y imprimer....
    Essaye en augmentant les margins .Attention elles sont en exprimees en 1/centieme de pouce (pouce=2.5 mm environ)....

    bon code..................

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous et bonne année 2017,

    Dans le cadre de ma recherche sur comment imprimer un TableLayoutPanel, je suis tombé sur ce Topic.

    MABROUKI, j'ai adapté ton bout de code à mon projet. Le TableLayoutPanel s'affiche correctement dans l'aperçu.
    Concernant l'erreur des marges, j'ai la même chose lorsque le TableLayoutPanel dépasse la taille de la zone imprimable.
    J'ai regardé s'il existait une forme simple de pouvoir redimensionner automatiquement le bitmap afin de l'adapter à la feuille mais pas si évident que cela.
    Il faut faire un calcul pour redimensionner son image en comparant la taille de la zone imprimable à la taille de l'image et d'adapter cette dernière pour qu'elle "rentre" dans la zone d'impression.
    J'ai essayé d'adapter ce bout de code juste avant la fin de ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim newWidth = memoryImagePanel.Width * 100 / memoryImagePanel.HorizontalResolution
            Dim newHeight = memoryImagePanel.Height * 100 / memoryImagePanel.VerticalResolution
            Dim widthFactor = newWidth / e.MarginBounds.Width
            Dim heightFactor = newHeight / e.MarginBounds.Height
            If widthFactor > 1 Or heightFactor > 1 Then
                If widthFactor > heightFactor Then
                    newWidth = newWidth / widthFactor
                    newHeight = newHeight / widthFactor
                Else
                    newWidth = newWidth / heightFactor
                    newHeight = newHeight / heightFactor
                End If
            End If
            MyGr.DrawImage(memoryImagePanel, 0, 0, CInt(newWidth), CInt(newHeight))
    Je pense que j'ai un soucis de taille car l'image est bien redimentionnée mais j'ai une vignette dans un coin ...

    Ensuite y a-t-il un moyen d'intégrer le contenu des RichTextBox qui se trouvent dan le TableLayoutPanel ?

    Merci d'avance pour vos suggestions

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Après plusieurs tests, j'obtiens toujours la même erreur de Target bound sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.TableLayoutPanel1.DrawToBitmap(memoryImagePanel, Me.TableLayoutPanel1.Bounds)
    Cette erreur se produit dès que le TableLayoutPanel1 est plus long. C'est comme si le memoryImagePanel est plus grand que le TableLayoutPanel1.Bound

    J'ai donc ajouter ceci avant cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim units As GraphicsUnit = GraphicsUnit.Point
        Dim bmpRectangleF As RectangleF = memoryImagePanel.GetBounds(units)
        Dim bmpRectangle As Rectangle = Rectangle.Round(bmpRectangleF)
    Form1.TableLayoutPanel1.DrawToBitmap(memoryImagePanel, bmpRectangle)
    Je n'ai plus l'erreur. Le tableau est bien réajusté pour rester sur une feuille A4. Par contre il a tendance à s'écraser dans le Printpreview. Je continue à chercher ....

    Mais une piste serait de détecter à partir de quelle ligne on sort de la page pour imprimer ensuite le reste sur une autre page. Est-ce possible ?

    Par contre mes richtextbox sont bien déssinés mais uniquement avec le rectangle blanc. Les labels également présents dans le TableLayoutPanel1 sont bien présents.

    Une suggestion ? Merci d'avance

  13. #13
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Si l'idée c'est d'imprimer tes RichTextBoxes, je viens de mettre le lien vers la "recette" pour imprimer un RTB dans ton autre discussion.

    Sinon le VBPowerPack, inclus dans VS2015 et à télécharger pour les autres, permet d'imprimer une Form sans trop de cérémonies. Il doit bien y avoir une explication dans MSDN.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Bon apparemment c'est la galère ... Enfin par rapport à mon niveau de compétence. J'ai fouiné à droite et à gauche et c'est pas si évident que cela.
    Autant je n'ai aucun soucis avec les labels qui se trouvent dans le TableLayoutPanel, autant avec les richtextbox c'est la misère.

    J'ai regardé le lien MSDN : https://support.microsoft.com/fr-fr/kb/811401 mais semble + pour imprimer directement un richTextBox

    En fait il faudrait un style de printscreen. Mais il peut arriver que le TableLayoutPanel soit un peu plus long et qu'on ne le voit pas sur l'écran (barres de défilement ..)
    L'exemple de code de MABROUKI marche bien pour afficher tout le TableLayoutPanel et les labels qui auraient pu être ajoutés mais pas ce qu'affiche le richtextbox ....

    Edit 1 : J'ai essayé avec le panel : idem y a tout sauf les contenus des richtexbox, je n'ai que les cadres des richtextbox. J'ai essayé avec SendMessage et c'est pareil

    Edit 2 : J'ai essayé avec CopyFromScreen mais je m'attendais un peu au résultat : C'est un Printscreen ... Donc ce n'est pas complet pour peu que le TableLayout a un scroolbar ....

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous,

    Voilà toujours à la recherche d'une solution .... J'ai testé ce code trouvé sur MSDN que j'ai adapté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Private Sub PrintDocument5_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument5.PrintPage
     
            Static page As Integer = 1
            Dim startPosition As Integer = (page - 1) * PrintDocument5.DefaultPageSettings.Bounds.Height
            Static maxPages As Integer = 0
     
            If page = 1 Then
                For Each ctrl As Control In Me.TableLayoutPanel1.Controls
                    If TypeOf ctrl Is RichTextBox Or TypeOf ctrl Is Label Or TypeOf ctrl Is PictureBox Then
                        ctrl.Tag = Int((ctrl.Top + ctrl.Height) / PrintDocument5.DefaultPageSettings.Bounds.Height) + 1
                        If CInt(ctrl.Tag) > maxPages Then maxPages = CInt(ctrl.Tag)
                    End If
                Next
            End If
     
            For Each ctrl As Control In Me.TableLayoutPanel1.Controls
                If CInt(ctrl.Tag) = page Then
                    If TypeOf ctrl Is RichTextBox Or TypeOf ctrl Is Label Then
                        Dim sf As New System.Drawing.StringFormat
                        If TypeOf ctrl Is RichTextBox Then
                            If DirectCast(ctrl, RichTextBox).SelectionAlignment = HorizontalAlignment.Right Then
                                sf.Alignment = StringAlignment.Far
                            Else
                                sf.Alignment = StringAlignment.Near
                            End If
                        ElseIf TypeOf ctrl Is Label Then
                            If DirectCast(ctrl, Label).TextAlign = ContentAlignment.TopLeft Then
                                sf.Alignment = StringAlignment.Near
                            ElseIf DirectCast(ctrl, Label).TextAlign = ContentAlignment.TopRight Then
                                sf.Alignment = StringAlignment.Far
                            End If
                        End If
                        sf.FormatFlags = StringFormatFlags.NoClip
                        e.Graphics.DrawString(ctrl.Text, ctrl.Font, New SolidBrush(ctrl.ForeColor), New RectangleF(ctrl.Left, ctrl.Top - startPosition, ctrl.Width + 50, ctrl.Height), sf)
                    ElseIf TypeOf ctrl Is PictureBox Then
                        e.Graphics.DrawImage(DirectCast(ctrl, PictureBox).Image, New PointF(ctrl.Left, ctrl.Top - startPosition))
                    End If
                End If
            Next
     
            page += 1
            If page > maxPages Then
                e.HasMorePages = False
                page = 1
                maxPages = 0
            Else
                e.HasMorePages = True
            End If
     
        End Sub
     
        Private Sub Test5_Click(sender As System.Object, e As System.EventArgs) Handles Test5.Click
            PrintDocument5.DefaultPageSettings.Landscape = True
            PrintDocument5.DefaultPageSettings.PaperSize = New System.Drawing.Printing.PaperSize("PaperA4", 826, 1169)
            PrintPreviewDialog1.Document = PrintDocument5
            DirectCast(PrintPreviewDialog1, Form).WindowState = FormWindowState.Maximized
     
            PrintPreviewDialog1.PrintPreviewControl.AutoZoom = True
     
            PrintPreviewDialog1.ShowDialog()
        End Sub
    Bilan : Tout les contenus de contrôles s'affichent (Labels et Richtextbox) sur la feuille

    Soucis à régler :
    - Tout est en noir et blanc et en texte. Je perds toutes les mises en forme des Richtextbox. Je pense que c'est lié au fait que je traite les labels et Richtextbox comme du texte ...
    - Je n'ai pas mon TableLayoutPanel1 de dessiné ...
    - L'affichage est incomplet car il déborde de la page en preview.

    Si quelqu'un pourrait me guider, ce sera très apprécié. Merci d'avance

  16. #16
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Rebonjour,

    Toujours à la recherche d'une solution ... Le code de base de MABROUKI que j'ai adapté à mon cas est nickel pour imprimer le TableLayoutPanel.
    Mais je n'arrive toujours pas à faire apparaitre les RichTextBox avec leurs mises en forme ...

    Merci d'avance pour vos futures suggestions.

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je balance un peu une idée en l'air mais sait-on jamais.

    Vu qu'apparemment, le "print screen" fonctionne, quel est le résultat si, via code, tu agrandis ton formulaire au delà des limites de l'écran de manière à ne plus avoir de barre de défilement et que tu imprimes le print screen ?

    En faisant cela bien sûr de manière invisible pour l'utilisateur (quitte à freezer sa fenêtre pendant que ça travaille, ça ne devrait pas prendre bien lontemps de toute façon).


    Après, faut voir si ça fait vraiment un print de ce qui est visible à l'écran ou un print de la fenêtre...

    N.B. : Je viens de tester en déplaçant mon navigateur à moitié hors de l'écran et en faisant "ALT + PrtScn" (pour ne prendre que la fenêtre active) et cela ne m'a pris que la partie visible... Ca semble donc mal barré. Mais ça donnera p-e une idée...
    Kropernic

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Hello,

    Kropenic, comme tu as pu t'en rendre compte, le printscreen ne prend que ce qui est visible. Mon Form occupe tout l'écran. Si j'ai un scroolbar, pour l'instant, je le refais monter par programme avant d'appliquer le Printscreen... mais s'il déborde, çà n'apparait pas

    Mon TableLayoutPanel est placé dans Un panel d'un splitcontainer. J'utilise le scroolbar du panel et non celui du TableLayoutPanel.

    Une autre piste serait de redimentionner le TablelayoutPanel et son contenu afin qu'il soit toujours entier dès que la scoolbar vertical apparaîtrait. Ou bien deux petits boutons style loupe + loupe - qui agrandirait, réduirait le tablelayoutpanel

    Mais là, je ne sais vraiment pas comment le faire ... Et est-ce possible ?

  19. #19
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonsoir à tous,

    Bon après moultes essais ou fusion de code, je n'arrive toujours pas à imprimer correctement ....
    si vous avez des suggestions, je suis preneur ...
    Merci d'avance

  20. #20
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. [Débutant] Exportation des Table Layout Panel vers PDF- VB .NET
    Par Aiman.elmachi dans le forum VB.NET
    Réponses: 0
    Dernier message: 12/06/2014, 11h26
  2. table layout panel en c#
    Par zouarimariem dans le forum Windows Forms
    Réponses: 0
    Dernier message: 10/04/2012, 00h09
  3. Design Table Layout Panel
    Par r0seBa dans le forum C#
    Réponses: 1
    Dernier message: 25/06/2010, 13h20
  4. Addrow table layout panel
    Par r0seBa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/01/2010, 16h27
  5. [procedure stockee] - Dupliquer une table et son contenu
    Par captusite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2006, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo