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

Windows Forms Discussion :

Couleurs du form modifiées lors d'un Image.Save


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut Couleurs du form modifiées lors d'un Image.Save
    Bonjour à tous,

    Après avoir tenté (et n'avoir pas réussi...) d'imprimer un form en bonne qualité, j'ai opté pour la solution de l'enregistrer d'abord en tant qu'image (l'enregistrement se fait en bonne qualité), puis d'imprimer le fichier ainsi créé.
    Mais j'ai un problème au niveau des couleurs.

    Mon formulaire est plus long que l'écran et pour le voir en entier, il faut utiliser les scrollbars.

    Voici le code que j'utilise pour l'enregistrement :

    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
    public void sauvegarder()
            {
                this.VerticalScroll.Value = 0;
     
                Graphics gr = null;
                IntPtr hdc = IntPtr.Zero;
     
                try
                {
                    memoryImage = new Bitmap(800, 1200, this.CreateGraphics());
     
                    gr = Graphics.FromImage(memoryImage);
                    hdc = gr.GetHdc();
                    IntPtr wParam = hdc;
                    IntPtr lParam = new IntPtr(PRF_CLIENT | PRF_CHILDREN);
                    Message msg = Message.Create(this.Handle, WM_PRINT, wParam, lParam);
                    this.WndProc(ref msg);
                }
                catch { }
                finally
                {
                    if (gr != null)
                    {
                        if (hdc != IntPtr.Zero)
                            gr.ReleaseHdc(hdc);
                        gr.Dispose();
                    }
                }
     
                memoryImage.Save("C:\\devis.bmp");
     
            }
    Après exécution, le fichier est bien créé et contient mon form en entier.
    Mais au niveau des couleurs il y a un problème :
    - la partie "haute" du form (c'est à dire tout ce qui est visible sans utilisation des scrollbars) est correcte
    - mais la partie "basse" du form (la partie que l'on ne voit qu'en baissant les scrollbars) n'a pas la couleur de fond définie dans le code !

    Au final, on voit dans l'image créée, toute la partie haute avec un fond couleur beige (celui définie dans le projet), et la partie basse avec un fond bleu/gris...

    De quoi est-ce que cela pourrait provenir ?
    Quelqu'un a-t-il une idée ?

    Je précise que j'ai utilisé plusieurs formats d'image (jpg, bmp, png, tiff), et j'obtiens toujours la même chose...

    Merci pour votre aide

  2. #2
    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 442
    Points
    4 442
    Par défaut print form ,fond gris/bleu
    bonjour nina
    tu est victime de PRF_CLIENT,la zone client car l'api imprime separement la zone client " sans barre de titre,croix,titre" ensuite les controles enfants ce qui a pour effet de decaler la zone client vers le haut par rapport aux controles enfants.
    il suffit de mettre dans form_load : this.FormBorderStyle=Windows.Forms.FormBorderStyle.None et de le retablir apres impression.
    ton code repris en vb.net .J'ai rajoute un PrintPreviewDialog1 pour les test.

    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
     
    Imports System
    Imports System.Windows.Forms
    Imports System.Runtime.InteropServices    'fonctions API 
     
    Public Class Form1
        Private Const WM_PRINT As Integer = &H317
        Private Const PRF_CLIENT As Integer = &H4
        Private Const PRF_CHILDREN As Integer = &H10
     
        Private Const PRF_NONCLIENT As Integer = &H2
        Private Const PRF_ERASEBKGND As Integer = &H8
        Private Const PRF_OWNED As Integer = &H20
        Dim memoryImage As Bitmap
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Fait disparaitre Barre de Titre et Croix avant d'imprimer 
            'ce qui a pour effet de remonter les controles enfants.
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        End Sub
        Private Sub MenuImprimerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuImprimerToolStripMenuItem.Click
            Printwindowex()
            '--------PrintPreviewDialog1 pour les tests que tu pourras supprimer apres------------
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.Show()
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable
            '--------A remettre apres-------------------------------------------------------------
     
            'PrintDocument1.Print()
        End Sub
     
        Public Function Printwindowex() As Bitmap
            Me.VerticalScroll.Value = 0
            Dim gr As Graphics = Nothing
            Dim hdc As IntPtr = IntPtr.Zero
            Try
                memoryImage = New Bitmap(800, 1200, Me.CreateGraphics())
                gr = Graphics.FromImage(memoryImage)
                hdc = gr.GetHdc()
     
                Dim wParam As IntPtr = hdc
                Dim lParam As IntPtr = New IntPtr(PRF_CLIENT Or PRF_CHILDREN)
                Dim msg As Message = Message.Create(Me.Handle, WM_PRINT, wParam, lParam)
                Me.WndProc(msg)
            Catch ex As Exception
            Finally
                If (gr IsNot Nothing) Then
                    If (hdc <> IntPtr.Zero) Then
                        gr.ReleaseHdc(hdc)
                        gr.Dispose()
                    End If
                End If
            End Try
            Return memoryImage
        End Function
     
        Private Sub PrintDocument1_PrintPage_1(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            e.Graphics.DrawImage(memoryImage, 10, 10)
        End Sub
     
    End Class
    bon code..............

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci de bien vouloir m'aider !!

    Mais je ne comprends pas : le code que tu reprends là c'est le code d'impression, pas le code de sauvegarde d'image.

    J'ai travaillé pendant longtemps sur ce code et mon form s'imprime en très mauvaise qualité j'ignore pour quelle raison...
    J'ai quand même retenté une nouvelle fois à partir du code exact tel que tu l'as écrit (converti en c# bien sur) et c'est toujours la même chose. J'ai une très mauvaise qualité...
    et ça ne vient pas de mon imprimante parce que si j'imprime dans un fichier avec PDF Creator, le résultat est le même...

    Je me suis donc rabattue sur la solution de sauvegarder le form en tant qu'image et d'imprimer ensuite l'image. Avec cette méthode la qualité semble bonne. Mais du coup j'ai le problème de la partie basse du form dont la couleur est modifiée...

    Est-ce que tu connais ce problème ?

    Merci

  4. #4
    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 442
    Points
    4 442
    Par défaut IMPRIMER UNE IMAGE AVEC PDF PRINTER
    bonjour Nina
    Ca ne change rien Nina
    Moi j'ai sur ma machine Microsoft Office Document Image Writer qui m'imprime un fichier image .tiff.
    Ce qui fait que PrintPreview ou Image.Save c'est "kif kif" on obtient un fichier image.
    parfois je fais PrintPreview avac Acrobat(pas le reader mais le createur Acrobat) par ce que lui aussi me cree un fichier image.
    Donc avec la fonction PrintPreview c'est plus souple j'ai un fichier image qui ressemble exactement à la sortie papier.
    tu n'as a peut etre pense à ca.
    Utiliser PrintPreview pour avoir une fichier image.
    Essai Imprime et Choisis imprimante Microsoft Office Document Image Writer .
    Par ailleurs la fonction PrintPreview te permet en plus de recuperer les settings de l'utilisateur (marge,format A4) et de demarrer directement l'impression de l'apercu.
    bon code....

  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 442
    Points
    4 442
    Par défaut MIMI
    Bonjour Mimi
    excuse moi d'avoir egratigne le pseudo,j' etais sur un autre post.
    bon code...

  6. #6
    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 442
    Points
    4 442
    Par défaut CI-JOINT FICHIER MDI
    Rebonjour
    ci-joint un apercu fichier microsoft imaging au format .mdi (le .tiff est monochrome).
    bon code...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci de m'avoir répondu.

    En fait, j'avais déjà pensé à imprimer dans un fichier.
    C'est pour ça que je t'avais écrit :

    J'ai une très mauvaise qualité...
    et ça ne vient pas de mon imprimante parce que si j'imprime dans un fichier avec PDF Creator, le résultat est le même...
    Quand j'ai eu ta réponse, j'ai tenté d'imprimer avec Microsoft Office Document Image Writer. Je constate que la qualité est bien supérieure à ce que j'obtenais avec PDF Creator. Mais c'est toujours pas super... (Alors que la qualité lors d'un save est bien meilleure!)

    On m'a orientée vers l'utilisation des propriétés Smoothing du graphics.
    J'ai donc tenté les lignes ci-dessous (que j'ai inclues dans l'événement print_page) mais je ne vois aucune différence...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    Est-ce que je les utilise correctement ?
    Sinon comment les modifier ?
    Est-ce que tu penses à une énième solution... ?

    Si tu ne vois plus de solution pour améliorer la qualité, aurais-tu une idée concernant la couleur du fond qui se modifie en bas de page lorsque je fais un Bitmap.Save ?

    En tous les cas merci pour ton aide, l'impression avec Microsoft Office Document Image Writer est déjà bien meilleure qu'avec PDF Creator...

  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 442
    Points
    4 442
    Par défaut capture d'ecran,resolution moniteur ou resolution printer
    Bonjour Mimi82

    Eclaircissons les chose avant de faire un choix de programmation.
    la nette d'une image
    1/prise par capture d'ecran =>depend de la resolution d'ecran maximale regle au panneau de configuration au moment de la capture.
    2/prise par scanner depend de la resolution du scanner maximale regle au scanner au moment du scan.
    3/prise par photo numerique depend de la resolution de l'appareil photo maximale regle sur l'appareil au moment de la prise photo.

    A l'impression le driver d'imprimante utilise pour imprimer des objets :
    A/Raster(tout ce qui est image bmp,tiff,jpeg ...etc)
    -resolution de l'image et non pas la resolution de l'imprimante.
    B/Vectoriel(ligne,rectangle,ellipse, fonction primitive graphique...,y compris eh oui le texte -font <=>objet dessine comme un rectangle ou ellipse)
    - resolution de l'imprimante bien superieure (300 dpi et plus).

    Si tu es est dans le cas 1/A(capture d'ecran) c'est ingerable à cause de la resolution d'ecran qui ne depasse 96 Dot Per Inch alors que l'imprimante demarre 300 Dot Per Inch et plus.
    Moi je recommende ce qui suit (B) :
    Pour acceder dans notre cas à cette resolution imprimante il faut imprimer un par un les controles :
    - directement (prop Text)
    - les positionner (prop Location)
    - font (prop Font) ).
    Les etapes à suivre:
    1/Scanne le devis si c'est papier, si c'est sur word imprime comme image au format desire (a4 ou a3).
    2/Recupere l'image et met la dans un panel
    3/Met taille du panel =taille image (taille image en pixel s'obtient dans explorateur win sur proprietes fichiers ->avance).
    4/Met ton forme avec autoscroll=true
    5/Utilise PrintPreview qui a les avantages qu'on va voir .
    6/Utilise un PrintDocument et imprime tes controles un à un

    Alors si tu as scanne ou imprime ton devis ,rajoute des labels par dessus les libelles .Les textbox sont deja prets sur ton form1.

    Un exemple valant 100 discours voici ce que je veux dire ,le 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
    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
     
     
    '1/l'image "Imprimeurs1.tif" du dossier Resources 
    ' -est une image imprime format A4 d'un document MS WORD
    ' -est utilisee pour positionner les labels et les textbox.
    '-est invisible à l'impression
    '2/Un Panel a ete rajoute sur le WinForm 
    ' -taille Panel= taille image -en pixel- de l'imprime 
    ' -Panel1.Autoscroll=True
    Public Class Form1
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            'Active Scrolling du Forme
            Me.AutoScroll = True
            'Pas de dock du panel1 .il sera position à 0,0
            Me.Panel1.Dock = DockStyle.None
            Me.Location = New Point(0, 0)
            'charge l'image du DEVIS modele (scanne ou imprime image au format A4à partir de MS Word)
            Me.Panel1.BackgroundImage = My.Resources.Imprimeurs1
            'Ajuste la taille du Panel à celle de l'image
            'la taille image en pixel s'obtient dans explorateur windows :Proprietes du Fichier ->Avance.
            Me.Panel1.Size = My.Resources.Imprimeurs1.Size
        End Sub
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim g As Graphics = e.Graphics
            'ici c'est "whyswig" what you see what you get
            g.PageUnit = GraphicsUnit.Display
            g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            'on cache l'image BackgroundImage
            Me.Panel1.BackgroundImage = Nothing
            For Each ctrl As Control In Me.Panel1.Controls
                'on n'imprime pas le button Apercu,c'est moche
                If Not (TypeOf ctrl Is Button) Then
                    Dim str As String = ctrl.Text
                    Dim fnt As Font = ctrl.Font
                    Dim couleur As Color = ctrl.ForeColor
                    g.DrawString(str, fnt, Brushes.Black, ctrl.Location.X, ctrl.Location.Y)
                End If
            Next
            'on restaure l'image BackgroundImage apres
            Me.Panel1.BackgroundImage = My.Resources.Imprimeurs1
        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
    ci-joint fichier rar de l'exemple.
    bon code.......

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/09/2013, 10h52
  2. Comment modifier par programmation une form crée lors de l'execution
    Par Fab.asia dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 31/07/2007, 14h47
  3. [AJAX] Modifier avec AJAX une image générée avec GD
    Par thsantac dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/03/2006, 19h34
  4. [CSS] Couleur et forme bordure entre cellules
    Par Trunks dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 10/05/2005, 14h19
  5. [VB.NET] [Forms] Modifier le fond d'une ligne
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/05/2004, 16h53

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