TUTORIEL  
C# : un éditeur de texte avec WinForms (3)
Les méthodes .NET pour ajouter les fonctionnalités de copie/coupure/insertion et sélection globale, et celles pour construire un menu contextuel. (07/12/2004)

Troisième partie de notre construction d'un éditeur de texte : après en avoir construit les fondations (notre article du 27 octobre), puis y avoir ajouté une meilleure gestion de la taille de la fenêtre et une vérification de la sauvegarde (notre article du 2 novembre), nous allons y ajouter un menu Modifier, classique de tous les éditeurs, et un menu contextuel pour ces mêmes fonctionnalités.

Les options de modification
La plate-forme .NET a été bien conçue, et une fois de plus ce dont nous avons besoin pour notre petit projet est directement accessible. Ainsi, pour pouvoir créer des actions de coupure, copie ou insertion du texte, il faut normalement passer par des méthodes du presse-papiers, ce qui peut se révéler assez laborieux selon les langages. Grâce à .NET, il suffit de faire appel aux méthodes dédiées de notre champ textuel (en l'occurrence, TextBox), Cut(), Copy(), Paste() et même SelectAll(). Celles-ci prennent en charge le presse-papiers, et le développeur n'a plus qu'à se soucier de la manière la plus adaptée de les implémenter…

Tout comme pour les menus précédemment créés Fichier et Infos, il faut créer le menu intermédiaire Modifier :

miModifier.MenuItems.Add(new MenuItem("Couper",
  new EventHandler(this.Couper_Clicked)));
miModifier.MenuItems.Add(new MenuItem("Copier",
  new EventHandler(this.Copier_Clicked)));
miModifier.MenuItems.Add(new MenuItem("Coller",
  new EventHandler(this.Coller_Clicked)));
miModifier.MenuItems.Add(new MenuItem("Tout sélectionner",
  new EventHandler(this.ToutSelectionner_Clicked)));

Enfin, triviaux, les gestionnaires d'évènements eux-mêmes, faisant appel aux fonctions de NET :

private void Couper_Clicked (object sender, System.EventArgs e)
  {
  Clipboard.SetDataObject(txt.SelectedText);
  txt.SelectedText = "";
  }

private void Copier_Clicked (object sender, System.EventArgs e)
  {
  txt.Copy();
  }

private void Coller_Clicked (object sender, System.EventArgs e)
  {
  txt.Paste();
  }

private void ToutSelectionner_Clicked (object sender, System.EventArgs e)
  {
  txt.SelectAll();
  }

Le premier gestionnaire est légèrement différent des autres : puisqu'il n'y a pas de méthode Cut(), nous devons ici agir directement avec le presse-papiers (Clipboard) en lui fournissant le texte sélectionner (txt.SelectedText), puis effacer de la fenêtre ce même texte sélectionné (le remplacer par une chaîne vide).

Le menu contextuel
Ajouter un menu contextuel a une application n'est guère plus compliqué que de lui créer une barre de menu simple : seule la classe diverge; nous utilisons ContextMenu() plutôt que MainMenu(). Très important : nous assignons ensuite MenuContextuel à la propriété ContextMenu de notre champ texte txt, sans quoi ce sera le menu standard qui apparaîtra.

ContextMenu MenuContextuel = new ContextMenu();
txt.ContextMenu = MenuContextuel;

Puis, on crée les options l'une après l'autre :

MenuItem CtxtCouper = new MenuItem();
CtxtCouper.Text = "Couper";
CtxtCouper.Click += new EventHandler(this.Couper_Clicked);
MenuItem CtxtCopier = new MenuItem();
CtxtCopier.Text = "Copier";
CtxtCopier.Click += new EventHandler(this.Copier_Clicked);
MenuItem CtxtColler = new MenuItem();
CtxtColler.Text = "Coller";
CtxtColler.Click += new EventHandler(this.Coller_Clicked);
MenuItem CtxtToutSelectionner = new MenuItem();
CtxtToutSelectionner.Text = "Tout sélectionner";
CtxtToutSelectionner.Click += new EventHandler(this.ToutSelectionner_Clicked);

Celles-ci font appel aux mêmes gestionnaires d'évènements que les options de notre menu Modifier, mais rien (sinon la volonté de ne pas dérouter l'utilisateur) n'empêche de faire appel à d'autres gestionnaires.

Enfin, nous attachons l'ensemble de ces options au menu contextuel, grâce à la méthode AddRange() :

MenuContextuel.MenuItems.AddRange(
  new MenuItem[]
    {
    CtxtCouper,
    CtxtColler,
    CtxtCopier,
    CtxtToutSelectionner
    }
  );

  Forum

Réagissez dans les forums de JDN Développeurs

De là, on pourrait facilement créer des sous-menus pour chaque option du menu contextuel, afin d'en grouper certaines. Autrement méthode de groupage d'options, créer un séparateur, qui n'est rien d'autre qu'une options de menu (MenuItem) dont le nom (attribut Text) est "-", et est intérprété par .NET comme une ligne de séparation...


 
Rédaction 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