Академический Документы
Профессиональный Документы
Культура Документы
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:
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
Bouton Proprit
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.
Nous faisons appel une procdure externe accessible par le bouton Imprimer de la barre doutils.
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.
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:
stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti
Page 4
C# 02-Methodes dimpression
S.R.
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.
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.
stephane.rossetti@wanadoo.fr http://perso.wanadoo.fr/stef.rossetti
Page 7
C# 02-Methodes dimpression
S.R.
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