Вы находитесь на странице: 1из 9

C# 02-Methodes dimpression

S.R.

02-METHODES DIMPRESSION
Cette section propose de rcuprer la solution de lexemple prcdent, richEditeur.sln, que vous trouverez dans le sous dossier sources. Il sagit dun diteur de texte conu avec un RichTextBox permettant des oprations de mises en forme, de copier/coller, de sauvegarde et douverture. Nous allons lui ajouter les fonctionnalits daperu avant impression et dimpression. Le processus dimpression implique de se poccuper de la slection dune imprimante, de la mise en page, de limpression de plusieurs pages...

MODIFICATION

DU FORMULAIRE

Double cliquer sur le fichier richEditeur.sln depuis lexplorateur Windows pour ouvrir la solution, Afficher le mode Design du formulaire,
Nous souhaitons ajouter les fonctionnalits dimpression au menu Fichier.

Slectionner le contrle MonMenu, Lui ajouter les trois entres Imprimer, Aperu avant et Mise en page comme lillustre la figure, Les nommer comme indiqu dans le tableau:

Imprimer... Aperu avant... Mise en page...

Entre du menu Fichier

Imprimer Apercu MiseEnPage

Nom

Ajouter les deux images 18-apercu.bmp et 19-imprime.bmp, que vous trouverez aussi dans le dossier Sources, la collection de lobjet ListeImg,
Ces deux images doivent servir pour les deux boutons supplmentaires de la barre doutils (Imprimer et Aperu avant impression).

Slectionner le contrle ToolBar, Afficher lditeur de collections ToolBarButtons (Proprit Buttons), Ajouter trois nouvelles entres en les paramtrant comme lindique le tableau de la page suivante.

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 1

C# 02-Methodes dimpression

S.R.
Valeur

Name Style Name ImageIndex ToolTipText Name ImageIndex ToolTipText

Bouton Proprit

Sep6 Separator ap 17 Aperu avant impression impr 18 Imprimer

Le rsultat obtenu est illustr par la capture ci-contre.

Ajouter ensuite un contrle PrintDocument, Le nommer imprDocument, Cliquer sur le bouton Evnements de la fentre Proprits pour afficher les vnements du contrle, Double cliquer sur lvnement PrintPage pour ajouter le gestionnaire dvnements,
private void imprDocument_PrintPage(object sender, System.Drawing.Printing.PrintPage EventArgs e) { char[] saut = {\n}; //Sauts de ligne //Fractionne selon sauts de ligne string[] lignes = Page.Text.Split(saut); int i=0; char[] retour = {\r}; foreach (string s in lignes) { lignes[i++] = s.TrimEnd(retour); } int x =20; int y =20; //Marges

//Dessine chaque ligne foreach(string ligne in lignes) { e.Graphics.DrawString(ligne, new Font(Arial,10), Brushes.Black, x, y); y += 15; }

Double cliquer ensuite sur lentre Imprimer du menu, Et, saisir son code comme suit: stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 2

C# 02-Methodes dimpression

S.R.

private void Imprimer_Click(object sender, System.EventArgs e) { Meth_Impr(); }

Nous faisons appel une procdure externe accessible par le bouton Imprimer de la barre doutils.

Saisir cette mthode:


private void Meth_Impr() { imprDocument.Print(); }

Puis, ajouter la branche ncessaire dans le gestionnaire de la barre doutils:


case 16: //Italique Meth_Italique(); break; case 17: //Soulign Meth_Souligner(); break;

case 24: //Impression Meth_Impr(); break;

Explications: La mthode Print() de lobjet PrintDocument appelle lvnement PrintPage du PrintDocument.


imprDocument.Print();

Dans le gestionnaire PrintPage, nous fractionnons ligne ligne le texte du RichTextBox laide de la mthode Split(): String.Split(), et du caractre de saute de ligne: \n. Ces chanes sont mmorises dans la variable lignes:
char[] saut = {\n}; string[] lignes = Page.Text.Split(saut);

Avec la mthode TrimEnd() de la classe String, le caractre \r est ensuite supprim de toutes les chanes:
int i=0; char[] retour = {\r}; foreach (string s in lignes) { lignes[i++] = s.TrimEnd(retour); }

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 3

C# 02-Methodes dimpression

S.R.

Ensuite, un second foreach permet denvoyer chaque ligne vers limprimante par un appel e.Graphics.DrawString(). e est une variable de type PrintPageEventArgs o la proprit Graphics est connecte au contexte de limprimante. La mthode DrawString() permet de dfinir la police et la couleur de sortie. La position de sortie, quant elle, est dfinie par les variables x et y:
int x =20; int y =20; foreach(string ligne in lignes) { e.Graphics.DrawString(ligne, new Font(Arial,10), Brushes.Black, x, y); y += 15; }

IMPRIMER

PLUSIEURS PAGES

Lvnement PrintPage doit tre appel depuis chaque page imprimer. La proprit HasMorePages de la classe PrintPageEventArgs True, indique que la page en cours dimpression nest pas la dernire.

Dclarer la variable lignes et une variable lignesImprime dans la classe:


private System.Drawing.Printing.PrintDocument imprDocument; private System.ComponentModel.IContainer components; private string[] lignes; private int lignesImprime;

Il faut maintenant modifier le gestionnaire PrintPage. Puisque la mthode OnPrintPage() est appele chaque page et puisque le fractionnement en lignes nest ncessaire quau dbut de lopration dimpression:

Remplacer le code du gestionnaire par le suivant:


private void imprDocument_PrintPage(object sender, System.Drawing.Printing.PrintPage EventArgs e) { //Marges int x =20; int y =20; //Dessine chaque ligne while(lignesImprime < lignes.Length) { e.Graphics.DrawString(lignes[lignesImprime++], new Font(Arial,10), Brushes.Black, x, y);

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 4

C# 02-Methodes dimpression

S.R.

} lignesImprime = 0; e.HasMorePages = false;

y += 15; if (y>=e.PageBounds.Height - 80) { e.HasMorePages = true; return; }

Ajouter ensuite un gestionnaire lvnement BeginPrint de lobjet PrintDocument:


private void imprDocument_BeginPrint(object sender, System.Drawing.Printing.Print EventArgs e) { char[] saut = {\n}; lignes = Page.Text.Split(saut); int i = 0; char[] retour = {\r}; foreach (string ligne in lignes) { lignes[i++] = ligne.TrimEnd(retour); }

Le dmarrage de la tche dimpression avec la mthode Print() du PrintDocument appelle son tour BeginPrint() une seule fois et OnPrintPage() pour chaque page. Dans BeginPrint(), le texte est fractionn au niveau du caractre de nouvelle ligne (\n), et le caractre de retour chariot (\r) est supprim. PrintPage() est appele aprs BeginPrint(). Nous poursuivons limpression tant que le nombre de lignes imprimes est infrieur celui des lignes imprimer. Nous dcrmentons les limites de 80 pixels. Si cette position est atteinte, la proprit HasMorePages est dfinie True. Le PrintController est dot de la mthode PrintLoop() qui sarrte si HasMorePages est false.
y += 15; if (y>=e.PageBounds.Height - 80) { e.HasMorePages = true; return; }

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 5

C# 02-Methodes dimpression

S.R.

MISE

EN PAGE

Ajouter un contrle PageSetupDialog, Le renommer MisePage, Fixer sa proprit Document imprDocument, Double cliquer sur llment de menu Mise en Page, Puis, saisir le code comme suit:
private void MiseEnPage_Click(object sender, System.EventArgs e) { MisePage.ShowDialog(); }

Nous devons maintenant changer limplmentation de PrintPage() pour utiliser les marges dfinies dans la bote de dialogue Mise en Page.; MarginBounds.Bottom gre les limites de page.

Modifier limplmentation PrintPage() comme suit:


private void imprDocument_PrintPage(object sender, System.Drawing.Printing.PrintPage EventArgs e) { //Marges int x =e.MarginBounds.Left; int y =e.MarginBounds.Top; //Dessine chaque ligne w h i l e ( l i g n e s I m p r i m e lignes.Length) { e.Graphics.DrawString(lignes[ ignesImprime++], new Font(Arial,10), Brushes.Black, x, y); y += 15; if (y>=e.MarginBounds.Bottom) { e.HasMorePages = true; return; } } lignesImprime = 0; e.HasMorePages = false; } < l

En excutant lapplication, et cliquant sur le menu, le dialogue suivant saffiche.

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 6

C# 02-Methodes dimpression

S.R.

BOTE

DE DIALOGUE

IMPRIMER

Ajouter un contrle PrintDialog, Le nommer dlgImprimer, Fixer sa proprit Document imprDocument, Puis, modifier la procdure Meth_Impr() comme suit:
private void Meth_Impr() { if (dlgImprimer.ShowDialog() == DialogResult.OK) { imprDocument.Print(); } }

En excutant lapplication et en cliquant sur le menu Imprimer, la bote de dialogue saffiche pralablement comme le montre la capture ci-contre. Limpression ne dmarre que si lutilisateur clique sur OK. Voyons maintenant comment il est possible de permettre limpression de la slection. Le bouton Radio Slection de la bote de dialogue, peut tre activ en rglant la proprit AllowSelection True.

Modifier le code du gestionnaire du menu Imprimer comme suit:


private void Meth_Impr() { if (Page.SelectedText != ) { dlgImprimer.AllowSelection = true; } if (dlgImprimer.ShowDialog() == DialogResult.OK) { imprDocument.Print(); } }

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 7

C# 02-Methodes dimpression

S.R.

Toutes les lignes imprimes sont configures dans le gestionnaire BeginPrint().

Dclarer tout dabord lespace de noms suivant en dbut de code:


using System.Drawing.Printing;

Puis, modifier limplmentation de BeginPrint() comme suit:


private void imprDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEve ntArgs e) { char[] saut = {\n}; //Si slection est coche dans la bote de dialogue. if (dlgImprimer.PrinterSettings.PrintRange == PrintRange.Selection) { lignes = Page.SelectedText.Split(saut); } else { lignes = Page.Text.Split(saut); } int i = 0; char[] retour = {\r}; foreach (string ligne in lignes) { lignes[i++] = ligne.TrimEnd(retour); }

BeginPrint() est appele au dmarrage de chaque tche dimpression. La proprit dlgImprimer .PrinterSettings.PrintRange dlivre les informations permettant de vrifier si lutilisateur a choisi loption slection. Dans ce cas, seule la slection est imprime:
lignes = Page.SelectedText.Split(saut);

APERU

AVANT IMPRESSION

DIALOGUE DAPERU AVANT IMPRESSION Ajouter un contrle PrintPreviewDialog, Le nommer dlgApercu, Fixer sa proprit Document imprDocument,
Il ne reste plus qu ajouter et implmenter un gestionnaire pour lvnement Click du menu Aperu avant impression.

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 8

C# 02-Methodes dimpression

S.R.

Double cliquer sur le menu Aperu avant..., Puis, saisir son code comme suit:
private void Apercu_Click(object sender, System.EventArgs e) { dlgApercu.ShowDialog(); }

Etant donn que nous avons reli le dialogue PrintPreviewDialog au contrle PrintDocument, il ne reste plus qu afficher laperu laide de la mthode ShowDialog(). La figure ci-contre illustre le rsultat obtenu aprs avoir excut lapplication, ouvert un fichier rtf et command laperu par le biais du menu.

stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti

Page 9

Вам также может понравиться