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 :

Imprimer un WinForm sans faire de capture d'écran ?


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 Imprimer un WinForm sans faire de capture d'écran ?
    Bonjour,

    Je cherche à imprimer un form (en c#).
    J'ai trouvé sur les forums une méthode qui revient souvent et qui consiste à faire une capture d'écran et à imprimer l'image ainsi obtenue.
    Mais avec cette méthode, la qualité est très mauvaise.
    Et j'ai besoin d'imprimer le form sans perte de qualité.

    Quelqu'un connait-il un moyen d'imprimer un formulaire sans passer par une capture d'écran ??

    Merci beaucoup pour votre aide.

  2. #2
    Membre averti

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 379
    Points
    379
    Par défaut
    Qu'est-ce que tu veux dire par "perte de qualité" : l'image obtenue lorsque tu fait une capture d'écran est exactement à la même résolution que ta résolution d'écran actuel.

    Peux-tu nous donner ta procédure de capture d'écran, que se soit via du code C# ou encore le presse-papier (via le bouton Impr. écran) ?
    ______________
    Never underestimated the browser
    Ne jamais sous-estimé le navigateur
    Vic Gundotra, Google IO 2009

  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
    Merci pour ta réponse.

    J'ignorais que l'image obtenue par la capture écran était à la même résolution que l'écran.
    Dans ce cas j'ignore d'où vient ma perte de qualité, mais le formulaire s'imprime en très mauvaise qualité.

    Les textes sont troubles et les contours de textbox, radioButton et autres ne sont pas nets.

    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
    private void menuImprimer_Click(object sender, EventArgs e)
            {
                PrintWindowEx();
                printDocument1.Print();
             }
     
     	private const int WM_PRINT = 0x0317;
            private const int PRF_CLIENT = 0x00000004;
            private const int PRF_CHILDREN = 0x00000010;
     
            public Bitmap PrintWindowEx()
            {
                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();
                    }
                }
                return memoryImage;
            }
     
            public void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                e.Graphics.DrawImage(memoryImage, 0, 0);
            }
    Merci pour ton aide.

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je pense que cette partie là pose problème:
    Essaie d'utiliser les valeurs réelles de la définition de ton écran.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    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
    Merci pour ta réponse,

    Peux-tu m'indiquer comment récupérer les valeurs de la définition de mon écran?

    Mais je ne suis pas sure de comprendre. Dans l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memoryImage = new Bitmap(800, 1200, this.CreateGraphics());
    tu conseilles de remplacer l'objet Graphics par les valeurs réelles ?
    ou c'est le '800, 1200' qui pose problème ?
    J'ai mis 800 et 1200 car je pensais que je devais mettre ici les dimensions de mon form...

    Je te remercie de m'aider je suis un peu perdue là...

  6. #6
    Membre averti

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 379
    Points
    379
    Par défaut
    J'ai parfois eu des problèmes lorsque j'essayais d'imprimer une capture d'écran en voulant l'imprimer sur une page pleine. En effet, la définition d'un écran est généralement inférieur à 100 points par pouces, alors qu'une imprimante à une définition de 300, 600 voir bien au-delà (2000) points par pouce. Si tu veux imprimer une Form sans perdre de qualité, il vaut peut-être mieux de ne pas trop l'étirer
    ______________
    Never underestimated the browser
    Ne jamais sous-estimé le navigateur
    Vic Gundotra, Google IO 2009

  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
    Oui mais le problème c'est que mon formulaire contient un devis.
    Et on ne me laisse pas trop le choix : les devis doivent être au format A4...

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Il y a encore plus simple, c'est de simuler un copy to clipboard ensuite tu n'a plus qu'a gerer l'image dans le clipboard

    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
    // **********************************************************************************************
     
        private void btn_Print_Click(object sender, EventArgs e)
        {
          string key = "";
          if (chkb_screen.Checked)
          {
            key = "+{PRTSC}";
          }
          else
          {
            key = "{PRTSC}";
          }
          SendKeys.SendWait(key);
          PrintDocument pd = new PrintDocument();
          pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
     
          PrintDialog pdd = new PrintDialog();
          pdd.Document = pd;
          pdd.ShowDialog();
     
          pd.Print();
     
     
        }
        // **********************************************************************************************
     
        private void pd_PrintPage(object sender, PrintPageEventArgs ev)
        {
          Bitmap window;
     
    // !! Ce code est ancien je pense qu'on peut faire mieux pour recuperer l'image du ClipBoard
          window = ((Bitmap)(Clipboard.GetDataObject().GetData("Bitmap")));
     
    // !! Amenager le DrawImage
          Point pos = new Point(10, 10);
          ev.Graphics.DrawImage(window, pos);
          ev.HasMorePages = false;
        }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    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
    Ok merci pour ta réponse.

    Je vais tester ta solution.
    Mais j'ai besoin de savoir à quoi correspondent chkb_screen et ev ?

    Merci

  10. #10
    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
    Je dois te préciser que mon form dépasse de l'écran et qu'il faut utiliser les scrollbars verticales pour le voir entièrement.

    Il me semble que ta solution ne récupérera que ce que l'on voit à l'écran non ?
    et non pas le form complet...

  11. #11
    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
    J'ai testé ta solution.

    Donc effectivement l'imprim écran se fait sur la totalité de l'écran et pas sur le formulaire complet.
    Et il y a la même perte de qualité qu'avec le code que j'utilisais au départ.

    Vous pensez pas à autre chose ????
    J'ai besoin d'aide je vois pas du tout quoi faire...

    Merci à tous!

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut
    Le chkb_screen.Checked c'est inutile pour toi
    Par contre ce que tu peux faire c'est adapter le drawimage pour utiliser un rectangle source et un rectangle destination afin de resizer l'image source au prorata de la taille que tu souhaite sur ta page imprimée
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    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
    Ok.
    Et pour la perte de qualité, est-ce que tu as une idée?
    Parce qu'avec ta méthode et avec la mienne je perds beaucoup en qualité...
    Je pensais que c'était du à la capture d'écran, mais apparemment pas...
    Est-ce que tu penses à quelquechose?
    Dans quel sens est-ce que je peux chercher?
    Merci

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Utilise les propriétés Smoothing du graphics
    Et veille a respecter les proportions des rectangles sources et destination
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Faire une capture d'écran du browser
    Par ptr83 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 21/03/2008, 10h55
  2. Comment faire une capture d'écran pour envoyer sur le forum ?
    Par jlb59 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 07/07/2007, 17h28
  3. [SOLARIS] Comment faire une capture d'écran?
    Par droussa dans le forum Solaris
    Réponses: 1
    Dernier message: 07/06/2007, 18h05
  4. [FAQ] [OpenGL] "Comment faire une capture d'écran ?"
    Par damienlann dans le forum Contribuez
    Réponses: 1
    Dernier message: 07/06/2006, 17h22
  5. Réponses: 10
    Dernier message: 10/10/2003, 14h25

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