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
.
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
.
Bonjour,
D'une manière générale ça tourne autour de PrintDocument et PrintPreviewDialog si tu veux passer par une dialog.
J@ck.
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 ?
.
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.
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.
.
Bonjour,
comme l'a indiqué JackHerror il faut utiliser la classe PrintDocument :
Quand l'impression va se lancer ta méthode "PrintPage" va être appelée. Tu auras en argument :
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();
* 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 :
Tu peux aussi dessiner des images, des lignes, des rectangles etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
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...
.
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.
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à ?
.
bonjour
Tu as l'air d'errer dans l'impression ...!!!
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à ?
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):
Contrairement aux MFC(utilise API GDI Native) ou l'infrastructure MFC fournit gratuitement :
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 ; } } }
-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...
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
.
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 !!!
bon 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
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; } } }
Partager