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 :

Recherche tutorial traitant de l'impression avec Windows Forms et C#


Sujet :

Windows Forms

  1. #1
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut Recherche tutorial traitant de l'impression avec Windows Forms et C#
    Bonjour,
    Tout est dans le titre
    J'ai consulté la rubrique "Tutoriels" mais n'ai pas trouvé un qui aborde les aspects liés à l'impression avec C# et .NET Framework
    Je vous remercie d'avance de votre aide
    .

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    D'une manière générale ça tourne autour de PrintDocument et PrintPreviewDialog si tu veux passer par une dialog.

    J@ck.

  3. #3
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    En fait, je me demandait s'il était possible de procéder de la manière proposée par les MFC en C++, c'est à dire utiliser la méthode Paint() de la View comme moyen unique de pouvoir afficher les graphiques à l'écran et les imprimer plutôt que deux méthodes distinct, une pour la Windows Form et une autre pour l'objet PrintDocument.
    Est-ce que cela est possible ou bien comment pouvoir reproduire un tel procédé en C# avec le .NET Framework ?
    .

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Désolé je ne connais pas vraiment c++ et encore moins MFC (personne n'est parfait !)
    Je ne comprend pas vraiment ce que tu demandes, mais je pense que c'est la preuve que je ne saurais te répondre...
    Tout ce que je sais c'est que Paint() permet de dessiner les graphique à l'écran et la classe PrintDocument permet d'imprimer, notamment les images, permettant de faire des imprimes écrans par exemple en récupérant une zone de l'écran...

    J@ck.

  5. #5
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Merci J@ck pour tes indications
    En fait, il s'agit de reproduire des tracés dans le contexte graphique de la vue sur l'imprimante en utilisant principalement la méthode Print() de la vue. Càd, envoyer à l'imprimante par la méthode Print() de la vue les affichages produites.
    Difficile de l'expliquer en une phase sans une longue démonstration, en effet. Peut-être que quelqu'un connaissant effectivement les classes MFCs pourrait m'aider à le réaliser.
    Merci en tout cas, j'apprécie ton attention sur la problématique.
    .

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Bonjour,
    comme l'a indiqué JackHerror il faut utiliser la classe PrintDocument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);//liaison de la callback
    pd.Print();
    Quand l'impression va se lancer ta méthode "PrintPage" va être appelée. Tu auras en argument :
    * object sender <-- probablement le PrintDocument
    * PrintPageEventArgs ev <--- cet argument te permet d'accéder au Graphics qui dispose de méthode de dessin. Je pense un peu comme dans MFC.

    Y'a qu'à voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
    Tu peux aussi dessiner des images, des lignes, des rectangles etc...

  7. #7
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Si je comprends bien, dans le cas où je souhaiterais visualiser dans un premier temps un document d'impression dans une Windows Form, puis ensuite l'envoyer à l'imprimante, il me faudra deux méthodes distinct, la méthode Paint() de la Form d'un côté, et de l'autre la méthode PrintPage() 'une instance de la classe PrintDocument.
    Je trouve un peu dommage d'être dans l'obligation de devoir procéder à une duplication de codes.
    Qu'en pensez-vous ?
    A moins que quelque chose m'ait échappé au passage...
    .

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Tu peux très bien créer une méthode qui prend en paramètre un Graphics.
    Comme ça que ce Graphics pointe sur un élément de ton Winforms ou qu'il pointe vers l'imprimante c'est transparent pour toi.

  9. #9
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Mais il y a l'aspect de la logique d'impression et de gestion des pages avec la propriété HasMorePages qui n'existe pas lorsque l'on trace dans une fenêtre.
    Quelle pourrait être alors la solution dans ce cas là ?
    .

  10. #10
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour


    Mais il y a l'aspect de la logique d'impression et de gestion des pages avec la propriété HasMorePages qui n'existe pas lorsque l'on trace dans une fenêtre.
    Quelle pourrait être alors la solution dans ce cas là ?
    Tu as l'air d'errer dans l'impression ...!!!
    1/PrintDocument permet de formatter la sortie imprimee !!!
    2/PrintPreviewControl permet de formatter la sortie à l'ecran (c'est un control "ad-hoc" dedie à ce besoin)...
    3/les 2 class cites ci-avant impriment dans l'event Print_Page de PrintDocument ...!!!

    En consequence , après avoir droppé les "sbires" cites ci-avant sur ton Form ,il suffit :
    -s'abonner à l'Event PrintDocument1.PrintPage
    -d'nserer ton code ,mis au point,de formattage de la sortie dans l'Event PrintDocument1.PrintPage
    -PrintPreviewControl.Document = PrintDocument;
    -prevoir 2 buttons btnPaintView & btnPrintView
    Et hop !!!

    Ce qui est démontré dans l'exemple de code behind .cs qui suit (impression d'un fichier texte ligne par line - dossier Bin\Debug du projet):
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Printing;
    using System.IO;
     
    namespace WinPrinting
    {
        public partial class Form2 : Form
        {
     
            private Font printFont;
            private StreamReader streamToPrint;
            private string pathFile = Application.StartupPath;
            public Form2()
            {
                InitializeComponent();
     
     
                this.printPreviewControl1.Zoom = 0.5;
                this.printPreviewControl1.UseAntiAlias = true; 
     
            }
            private void button1_Click(object sender, EventArgs e)
            {
     
                try
                {
                    pathFile += "//MyFile.txt";
                    if (streamToPrint != null) streamToPrint.Close();
                    streamToPrint = new StreamReader(pathFile);
                    printFont = new Font("Arial", 10);
                    this.printPreviewControl1.Document = this.printDocument1;
                    this.printDocument1.PrintPage += new PrintPageEventHandler(pdPrev_PrintPage);
     
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
     
            }
     
     
     
            // The PrintPreviewControl will display the document
            // by handling the documents PrintPage event
            private void pdPrev_PrintPage(object sender, PrintPageEventArgs e)
            {
     
                Graphics gr = e.Graphics;
                float linesPerPage = 0;
                float yPos = 0;
                int count = 0;
                float leftMargin = e.MarginBounds.Left;
                float topMargin = e.MarginBounds.Top;
                string line = null;
     
                // Calculate the number of lines per page.
                linesPerPage = e.MarginBounds.Height /printFont.GetHeight(e.Graphics);
     
                // Print each line of the file.
                while (count < linesPerPage &&
                   ((line = streamToPrint.ReadLine()) != null))
                {
                    yPos = topMargin + (count *printFont.GetHeight(e.Graphics));
                    gr.DrawString(line, printFont, Brushes.Black,
                       leftMargin, yPos, new StringFormat());
                    count++;
                }
     
                e.HasMorePages = false    ;
     
            }
     
     
        }
    }
    Contrairement aux MFC(utilise API GDI Native) ou l'infrastructure MFC fournit gratuitement :
    -un DC d'ecran pour Viewraw
    -un DC d'imprimant pour View:Override (pour impression)
    -une reference sur le Document

    En .Net(utilise API GDI+) ,il ya un class Graphics (qui "wrappe" un DC GDI native)
    Une instance du class Graphics est disponible dans :
    - un Event pour un Control ou PrintDocument
    - un appel à Control.CreateGraphics()....PrintDocument n'as pas de CreateGraphics()....
    - Graphics.FromImage(Bitmap)
    bon code...

  11. #11
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Je ne vais pas trop insister sur le sujet et prendre mon parti avec la méthode d'impression du .NET Framework sans trop chercher à creuser davantage.
    Merci beaucoup MABROUKI
    .

  12. #12
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    re

    OUPS !!!
    j'ai donne le mauvais code exemple !!!
    En fait c'est le meme code (SANS DUPLIQUER LE CODE) de la sortie impression transmis par 2 buttons soit à PrintPreviewControl ,soit PrintDocument :
    Tant pis pour moi !!!
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Printing;
    using System.IO;
    using System.Drawing.Imaging;
     
    namespace WinPrinting
    {
        public partial class Form1 : Form
        {
            private Font printFont;
            private StreamReader streamToPrint;
            private string pathFile = Application.StartupPath + "//MyFile.txt";
            public Form1()
            {
                InitializeComponent();
                this.printPreviewControl1.Zoom = 1.5;
                this.printPreviewControl1.UseAntiAlias = true;
     
                //EVENT
                this.printDocument1.PrintPage += new PrintPageEventHandler(pd_PrintPage);
            }
     
     
     
     
     
            private void btnPaintView_Click(object sender, EventArgs e)
            {
                try
                {
     
                    if (streamToPrint != null) streamToPrint.Close();
                    streamToPrint = new StreamReader(pathFile);
     
                    printFont = new Font("Arial", 10);
                    this.printPreviewControl1.Document = this.printDocument1;
     
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
     
            private void btnPrintView_Click(object sender, EventArgs e)
            {
                try
                {
                    if (streamToPrint != null) streamToPrint.Close();
                    streamToPrint = new StreamReader(pathFile);
     
                    printFont = new Font("Arial", 10);
                    this.printDocument1.Print();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
     
            }
     
            // UN EVENT PrintPage A DOUBLE TRANCHANT 
     
            private void pd_PrintPage(object sender, PrintPageEventArgs e)
            {
     
                Draw(e);
            }
     
     
            // CODE DE MISE EN FORME IMPRESSION REGROUPE 
            // DANS CE METHOD
            private void Draw(PrintPageEventArgs ev)
            {
                Graphics gr = ev.Graphics;
                float linesPerPage = 0;
                float yPos = 0;
                int count = 0;
                float leftMargin = ev.MarginBounds.Left;
                float topMargin = ev.MarginBounds.Top;
                string line = null;
     
                // Calculate the number of lines per page.
                linesPerPage = ev.MarginBounds.Height /
                   printFont.GetHeight(ev.Graphics);
     
                // Print each line of the file.
                while (count < linesPerPage &&
                   ((line = streamToPrint.ReadLine()) != null))
                {
                    yPos = topMargin + (count *
                       printFont.GetHeight(ev.Graphics));
                    gr.DrawString(line, printFont, Brushes.Black,
                       leftMargin, yPos, new StringFormat());
                    count++;
                }
     
                ev.HasMorePages = false;
     
            }
     
        }
    }
    bon code....

  13. #13
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Merci beaucoup (:
    .

Discussions similaires

  1. Impression avec Windows 8
    Par Dany3 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/03/2015, 08h41
  2. Application d'envoi de mail avec Windows Forms
    Par longbeach dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/12/2012, 19h35
  3. multithreading avec windows form
    Par tortuegenie dans le forum Windows Forms
    Réponses: 9
    Dernier message: 06/06/2011, 14h23
  4. RS232 avec Windows Form sous Visual Studio 2008
    Par Jerepain dans le forum Visual C++
    Réponses: 8
    Dernier message: 14/05/2009, 18h02
  5. session timeout avec windows forms
    Par modafine dans le forum Windows Forms
    Réponses: 0
    Dernier message: 27/01/2009, 10h19

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