TUTORIEL TECHNOS .NET 
WinForms : gérer les options d'impression
Reprise de notre éditeur de texte, avec l'ajout de deux fonctionnalités liées à l'impression : la mise en page du document, et son aperçu avant impression. (16/01/2006)
Notre première approche de C# (lire l'article du 28/11/05) nous avait amené à implémenter une impression simple, lancée depuis le menu de notre éditeur de texte bien-aimé. La fonctionnalité était telle que le document était imprimé avec les réglages par défaut de l'imprimante, sans intervention possible du rédacteur. C'est ce que nous allons modifier dans cet article.

C'est ici que l'on constate combien la modularité de .NET paye : dans les faits, construire un aperçu du document à imprimer n'est pas très éloigné du code nécessaire pour imprimer ce même document. Dans le cas d'une impression, c'est la classe PrintDocument qui nous préoccupait, et si l'on veut simplement afficher une prévisualisation, le code sera quasiment le même, modulo quelques classes clefs.

Pour commencer, l'ajout d'options dans le menu fichier, pour la mise en page et l'aperçu, ne varient guère par rapport aux épisodes précédents :

  miFile.MenuItems.Add(new MenuItem("Imprimer", new EventHandler(this.Imprimer_Clicked)));
  miFile.MenuItems.Add(new MenuItem("Mise en page", new EventHandler(this.MiseEnPage_Clicked)));
  miFile.MenuItems.Add(new MenuItem("Aperçu avant impression", new EventHandler(this.ApercuImpression_Clicked)));


Les évènements sont ensuite très comparables :

  private void Imprimer_Clicked(object sender, EventArgs e) {
    try {
      sreader = new StringReader(txt.Text);
      try {
        printFont = new Font("Arial", 10);
        pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
        pd.Print();
        }
      finally {
        sreader.Close();
        }
      }
    catch(Exception ex) {
      MessageBox.Show(ex.Message);
      }
    }


Il s'agit ci-dessus de la méthode qui déclenche l'impression du document, vue dans notre article précédent. Elle fait appel à une autre méthode, pd_PrintPage(), non reproduite ici, pour monter le graphisme même de la page.

protected void MiseEnPage_Clicked(object sender, System.EventArgs e) {
  try {
    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    PageSetupDialog setup = new PageSetupDialog();
    PageSettings settings = pd.DefaultPageSettings;
    setup.PageSettings = settings;
    if (setup.ShowDialog() == DialogResult.OK)
      pd.DefaultPageSettings = setup.PageSettings;
    }
  catch(Exception excp) {
    MessageBox.Show(excp.Message);
    }
  }


Cheminement tout à fait logique, tout en faisant également appel à pd_PrintPage() : on instancie la classe PageSetupDialog() dans setup, en même temps que l'on créé un objet PageSettings, settings, qui contient les réglages par défaut. Ceux-ci sont appliqués à la propriété PageSettings de setup.

On ouvre alors la boîte de dialogue, et une fois celle-ci validée, les potentiels nouveaux réglages sont appliqués à la propriété des réglages par défaut de la page, pd.DefaultPageSettings. Parce que pd est une variable de classe, on retrouvera ces réglages partout où l'on fera ensuite appel à elle.

protected void ApercuImpression_Clicked(object sender, System.EventArgs e) {
  try {
    sreader = new StringReader(txt.Text);
    PrintPreviewDialog ppd = new PrintPreviewDialog();
    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    ppd.Document = pd;
    ppd.ShowDialog();
    }
  catch(Exception exp) {
    MessageBox.Show(exp.Message);
    }
  }


L'aperçu diverge peu. La grosse diffférence de code est que l'on n'applique pas de réglages à la page : il n'y a pas de transfert d'informations, on ne fait que prendre ce qui existe. Ainsi, les changements de mise en page se répercuteront sur l'aperçu, en bonne logique, grâce à pd. L'ensemble de l'aperçu est géré par PrintPreviewDialog.

On voit donc que les principales classes utilisées sont PrintDocument (instancié en début de programme sous le nom pd) pour l'impression, PageSetupDialog pour la mise en page, et PrintPreviewDialog pour l'aperçu. Le contenu est ensuite ici placé de la même manière au sein des variables d'objet - même s'il y a des techniques plus spécifiques pour chaque objet. C'est tout l'intérêt de la modularité de .Net, et du nommage explicite des objets.

  Forum

Réagissez dans les forums de JDN Développeurs

Il faut noter l'importance d'avoir l'objet pd, l'instance principale de PrintDocument, comme variable de classe : c'est le seul moyen de faire transiter les informations entre les différents modules .NET. Sans cela, à chaque action sur ces modules, l'appel d'un nouveau module ne verrait s'afficher qu'une table rase.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages