Printform vb express

vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 - 13 août 2013 à 16:37
vercomax Messages postés 547 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.

38 réponses

Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
13 août 2013 à 17:01
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
13 août 2013 à 17:13
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 % ?


--
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
13 août 2013 à 18:00
Voulez-vous dire que le PrintForm vous délivre un bitmap, c'est-à-dire un objet de classe Bitmap ?
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
13 août 2013 à 19:16
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
13 août 2013 à 20:10
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 08:24
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.
--
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
14 août 2013 à 08:36
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 09:35
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.

--
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
14 août 2013 à 10:17
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 10:33
D'accord, je m'y met et je me permet de vous recontacter plus tard.
Merci.

--
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
14 août 2013 à 10:58
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 août 2013 à 13:00
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
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 13:51
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.

--
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 14:27
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.

--
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 15:28
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.

--
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
14 août 2013 à 15:31
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 16:06
Zermelo, merci,

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

--
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 août 2013 à 16:19
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
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 17:19
Merci cs_ShayW,

Mais çà reste baveux à l'impression à cause de ma résolution écran.
Je continue de chercher ...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 août 2013 à 17:40
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 ?
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 18:26
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
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
14 août 2013 à 18:31
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 août 2013 à 19:14
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.
0
vercomax Messages postés 547 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 11 septembre 2013 2
14 août 2013 à 20:06
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
--
0
Rejoignez-nous