Printform vb express

Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
- - Dernière réponse : vercomax
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
- 28 août 2013 à 13:01
Bonjour,

Je suis en train de constater que l'impression d'une form avec l'objet printform n'est vraiment pas propre. D'autre part on ne peut pas gérer la position de l'impression sur la feuille. Avez-vous ces genres de problèmes ? Me faut-il passer par un Printdocument ou bien existent-ils des controles à télécharger plus poussés que le Printform.
Merci pour vos réponses.
Afficher la suite 

20/38 réponses

Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Bonjour vercomax.

À mon avis, le mieux est de faire une capture d'écran limitée au formulaire. Vous obtiendrez ainsi un bitmap que vous pourrez aisément imprimer et cadrer à votre gré.
Cordialement.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Ha, merci pour votre réponse.
Mais là j'ai l'impression que le PrintForm fait une capture d'écran et ensuite à l'impression c'est baveux puisque que ma form ne fait que 300x300 pixel et que je l'imprime sur une étiquette de 80x80mm avec en plus un code barre ean13
Peut-être me faut il utiliser une form très grande et demande ensuite une impression en taille réduite en % ?


--
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Voulez-vous dire que le PrintForm vous délivre un bitmap, c'est-à-dire un objet de classe Bitmap ?
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Je ne sais pas car on ne me délivre rien, j'utilise juste la méthode print du printform en ayant au préalable donné la form concernée. l'imprimante est en 300x300 dpi, j'ai même essayé de monté cette résolution à 600 par le code et rien n'y change. Dans la Form que j'imprime j'ai: des Labels, des TextBox, des PictureBox des LineShapes. 1 Label affiche le code ean13 sous forme graphique grace à une police ttf et bien sur le code généré par mon prog. Mais même dans les autres Labels ou TexBox l'impression n'est pas propre, çà bave.
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Bonsoir vercomax.

Résumons-nous. Avec la méthode Print du PrintForm, ça bave. Cela n'est pas pour m'étonner. Le PrintForm à mauvaise presse en vb.net, mais non en VB6. Aussi, quand je suis passé de VB6 à vb 2010, ai-je décidé de suivre une autre voie, celle que je vous ai proposé dans les grandes lignes :
1) Faire une capture d'écran limitée au formulaire, qui produit un bitmap.
2) Dessiner ce bitmap, par les méthodes de dessin de vb.net, qui dessinent des traits, des ellipses, des bitmaps, des textes, des courbes de Bézier, et autres joyeusetés.

Je suis disposé à vous aider dans cette voie. Faites-moi savoir si cela vous convient.
Cordialement.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Bonjour et merci pour votre aide.

Je vais suivre vos conseils:

1: afficher ma Form à l'écran.

2: faire une capture de la zone que je souhaite imprimer.

3: Avec quel Objet imprimer ce bitmap ?

Merci pour vos réponses.
--
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Bonjour vercomax.

Pour imprimer en général et en particulier pour un bitmap, utiliser le composant PrintDocument ou la classe PrintDocument. Le choix entre ces deux possibilités est uniquement une question de préférence personnelle.
Cordialement.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Avez-vous un exemple simple ? Comme par exemple l'impression d'un picturebox ou un copscreen ? Sachant que je préfère utiliser les composants.
Merci.

--
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Désolé, mais votre question n'est pas pertinente. Imprimer proprement un PictureBox ou un formulaire revient au même : effectuer une capture d'écran partielle, qui produit une image (un bitmap en l'occurrence) puis imprimer cette image. Dans cette étape, il n'est plus question de ce que vous voulez imprimer, mais seulement de l'image de ce que vous voulez imprimer.
Pratiquement, je crois qu'il vaut mieux que vous commenciez par apprendre à récupérer une image par capture d'écran partielle. Il sera alors temps d'apprendre à imprimer une image.
Et alors vous aurez appris beaucoup de choses qui vous serviront pour d'autres travaux.
Cordialement.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
D'accord, je m'y met et je me permet de vous recontacter plus tard.
Merci.

--
Messages postés
6347
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
88
0
Merci
Bonjour,

Il existe en VB.NET un code pour capturer les contrôles y compris le form; Il suffit ensuite d'imprimer l'image de cette capture. Voir ce programme en VB2010

http://codes-sources.commentcamarche.net/source/54783-capture-de-controles


--
@+ Le Pivert
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46
0
Merci
Salut
une class qui imprime un composant

Imports System.Drawing.Printing
Public Class ClassImpression
    Private myimage As Bitmap
    Private thectrl As Control
    Private position As Point


    Private Function Capturectrl() As Bitmap
        Dim memoryImage As Bitmap
        Dim memoryGraphics As Graphics
        memoryImage = Nothing
        Dim s As Size = thectrl.Size
        memoryGraphics = thectrl.CreateGraphics
        memoryImage = New Bitmap(s.Width, s.Height, memoryGraphics)
        memoryGraphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(thectrl.Location, Point.Empty, New Size(memoryImage.Width, memoryImage.Height), CopyPixelOperation.SourceCopy)
        Return memoryImage
    End Function
    Public Function GetBitmap() As Bitmap
        Return Capturectrl()
    End Function
    Public Sub printdoc(Optional ByVal xp As Integer = 0, Optional ByVal yp As Integer = 0)
        Try
            position.X = xp
            position.Y = yp
            Dim printdoc As New PrintDocument
            Dim ppd As New PrintPreviewDialog
            myimage = Capturectrl()
            AddHandler printdoc.PrintPage, AddressOf printform
            'paramètres de page
            Dim ps As New PageSettings
            ps.Landscape = False
            printdoc.DefaultPageSettings = ps
            'indique à la prévisualisation le document à montrer
            ppd.Document = printdoc
            ppd.WindowState = FormWindowState.Maximized
            'imprssion si ok
            If ppd.ShowDialog = Windows.Forms.DialogResult.OK Then
                ppd.Document.Print()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub


    Private Sub printform(ByVal sender As Object, ByVal e As PrintPageEventArgs)
        Try
            e.Graphics.DrawImage(myimage, position.X, position.Y)
            e.HasMorePages = False
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Public Sub New(ByVal ctrl As Control)
        thectrl = ctrl

    End Sub
End Class


pour utiliser

Dim printer As New ClassImpression(composant de ta form)
printer.printdoc(300, 400)


je ne sais pas si c'est ce que tu demandes
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Merci à tous pour vos aides.
Pour l'instant, je suis la méthode de Zermelo:

Private Sub cree_img(i_form As Form)
Dim i_bitmap As Bitmap
Dim gfx As Graphics

i_bitmap = New Bitmap(i_form.ClientSize.Width, i_form.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
gfx = Graphics.FromImage(i_bitmap)
gfx.CopyFromScreen(i_form.Location, New Point(0, 0), i_form.Size, CopyPixelOperation.SourceCopy)

i_bitmap.Save("c:\capture.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

gfx.Dispose()
i_bitmap.Dispose()
End Sub

j'ai bien un fichier créé au format jpg, mais quand je l'imprime çà reste baveux. De toutes manières il suffit de zoomer le fichier dans un lecteur pour voir que c'est pas propre.

Je me demande si au copyfromscreen on peut augmenter la résolution de capture ?
Et je me demande surtout si je doit partir d'une capture d'écran, donc être tributaire de sa résolution ?

Merci.

--
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Après tous les tests que je viens de faire, je me rend compte qu'il ne faut pas passer par une copie d'écran et imprimer l'image. Il faut vraiment trouver un autre moyen.

--
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
J'ai trouvé une solution temporaire qui consiste à surdimensionner les controles et les tailles de police de ma form, quand je demande le print form, l'imprimante recadre tout çà au format de l'étiquette et là mon code barre est douchable.
Mais je pense que ce n'est pas la bonne solution, juste temporairement.

--
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Vous avez compliqué inutilement les choses. En particulier il ne fallait surtout pas sauvegarder le bitmap dans un fichier.
Mais bon, faites comme vous l'entendez.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Zermelo, merci,

Je ne sais pas comment imprimer le bitmap, alors pour mes test je le sauve et je l'imprime ensuite "à la main"

--
cs_ShayW
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46 -
essaie ça
Imports System.Drawing.Printing
Public Class ClassImpression
    Private myimage As Bitmap
    Private thectrl As Form
    Private position As Point


    Private Function Capturectrl() As Bitmap
        Dim memoryImage As Bitmap
        Dim memoryGraphics As Graphics
        memoryImage = Nothing
        Dim s As Size = thectrl.Size
        memoryGraphics = thectrl.CreateGraphics
        memoryImage = New Bitmap(s.Width, s.Height, memoryGraphics)
        memoryGraphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(thectrl.Location, Point.Empty, New Size(memoryImage.Width, memoryImage.Height), CopyPixelOperation.SourceCopy)
        Return memoryImage
    End Function
    
    Public Sub printdoc(Optional ByVal xp As Integer = 0, Optional ByVal yp As Integer = 0)
        Try
            position.X = xp
            position.Y = yp
            Dim printdoc As New PrintDocument
            Dim ppd As New PrintPreviewDialog
            myimage = Capturectrl()
            AddHandler printdoc.PrintPage, AddressOf printform
            'paramètres de page
            Dim ps As New PageSettings
            ps.Landscape = False
            printdoc.DefaultPageSettings = ps
            'indique à la prévisualisation le document à montrer
            ppd.Document = printdoc
            ppd.WindowState = FormWindowState.Maximized
            'imprssion si ok
            If ppd.ShowDialog = Windows.Forms.DialogResult.OK Then
                ppd.Document.Print()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub printform(ByVal sender As Object, ByVal e As PrintPageEventArgs)
        Try
            e.Graphics.DrawImage(myimage, position.X, position.Y)
            e.HasMorePages = False
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Public Sub New(ByVal ctrl As Form)
        thectrl = ctrl

    End Sub
End Class

'dans ta form ajoute un  bouton et dans l'event click

Private Sub Button1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ButtonPlay.MouseClick
        Try
            Dim printer As New ClassImpression(Me)
            printer.printdoc(0, 0)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
vercomax
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2 -
Merci cs_ShayW,

Mais çà reste baveux à l'impression à cause de ma résolution écran.
Je continue de chercher ...
cs_ShayW
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46 -
tout le prob est la resolution de ton imprimante
aussi si tu redimensionnes ta form et les composants
le résultat sera aussi baveux
question
si tu crées un dessin avec le paint ou meme imprime un document word
et l'imprime le résultat est aussi baveux ?
vercomax
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2 -
Mon imprimante est en 300dpi et elle imprime proprement des mini-documents word ou excel. C'est une imprimante spéciale pour étiquettes de 80x80mm, donc 3.15x3.15 pouces. Sachant que ma form fait 300px300p, l'image de la form qui est imprimée doit être étirée d'environ 3 fois non ? D'où l'effet baveux
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
0
Merci
Imports System.Drawing.Imaging
Imports System.Drawing.Printing
Imports System.Drawing.Color
Public Class Accueil
Private Bmp As Bitmap, Prt As New PrintDocument

Private Sub Accueil_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler Prt.PrintPage, AddressOf Me.Prt_PrintPage
End Sub

Private Sub bCpt_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bCpt.Click
CréerBitmap()
End Sub

Private Sub bImp_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bImp.Click
Prt.Print()
Prt.Dispose()
End Sub

Private Sub pBox_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pBox.Paint
Dim Crn As New Pen(Color.Red, 1)
Dim Fnt As New Font("Times New Roman", 10, FontStyle.Regular)
Dim Pnc As New SolidBrush(Color.Black)
Dim g As Graphics = e.Graphics
g.DrawLine(Crn, 0, 0, pBox.Width, 0)
g.DrawLine(Crn, 0, 0, 0, pBox.Height)
g.DrawString("Point", Fnt, Pnc, 1, 1)
End Sub

Private Sub CréerBitmap()
Dim x As Integer, y As Integer
Dim p As Point, q As Point
Dim sz As Size, g As Graphics
sz = Me.ClientSize
Bmp = New Bitmap(sz.Width, sz.Height) : g = Graphics.FromImage(Bmp)
p.X = 0 : p.Y = 0 : q = PointToScreen(p) : x = q.X : y = q.Y
g.CopyFromScreen(x, y, 0, 0, Bmp.Size)
End Sub

Private Sub Prt_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
e.Graphics.DrawImage(Bmp, 0, 0)
End Sub

End Class
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bonjour,
vaste débat !
Il ne s'agit pas là de traiter du texte et des images vectorielles, mais bel et bien des pixels.
Tout étirement, notamment et plus encore en réduction, ne peut que se traduire par une détérioration.
Exemple de réflexion : imaginez un rectangle de 10 pixels par 2 pixels. Imaginez que vous souhaitiez le réduire par 3 (appliquer un coeff de 1/3 en hauteur et en largeur). Calculez le résultat ! Il ne risquera pas d'avoir les mêmes proportions.
Et c'est là un exemple simple. Si, en plus, ce rectangle est un morceau d'un dessin plus grand, seront également affectées son abscisse et son ordonnée.
La pixelisation ne saurait conduire à des miracles.
Amitiés.
Messages postés
548
Date d'inscription
mercredi 28 juillet 2004
Statut
Membre
Dernière intervention
11 septembre 2013
2
0
Merci
Ucfoutu, merci,
Vous avez raison et je ne comprend pas pourquoi il n'existe pas de contrôle pour gérer ces problèmes. Dans la même famille, word, excel, etc; quand vous imprimez un document il sort propre. Pourtant on n'imprime pas que du texte ! on peut mixer plein de chose. Voilà, je continue mes recherches.
Merci à tous
--