Une remarque pertinente ?
Une critique impertinente ?
Un lynchage en règle ?
Une invitation sous les tropiques ?

Ecrivez-moi !

Conçu et enseigné tel qu'en lui même, avec pertes, fracas et humour de qualité supérieure            
 par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7)            


 

 

 

Partie 11

Les menus

Avec ce tout petit, petit chapitre, on va pouvoir reposer un peu nos neurones surmenés.

1. Le concepteur de menus

Sauf rare exception, les menus sont un élément incontournable d'une interface applicative. Or, pour créer un système de menus, rien de plus simple. Il suffit de créer un objet (un seul) de la classe MenuStrip (littéralement, « bande » ou « barre » de menus), disponible dans la boîte à outils. Cet objet ouvre en fait une interface graphique qui permet de disposer à loisir et d'un simple clic, menus et sous-menus. C'est extrêmement facile et ergonomique, il suffit de cliquer à côté, ou en-dessous, d'un élément pour pouvoir entrer d'autres éléments dans la position voulue.

Côté code, c'est un peu plus compliqué, mais pas beaucoup. Chacun de ces éléments, future commande d'un menu, est un ToolStripMenuItem. S'il se trouve des éléments placés « sous » cet élément, ils forment logiquement une collection. C'est le principe de l'arborescence, et c'est toujours le même, qu'il s'applique aux répertoires, aux contrôles conteneurs d'une Form ou à une architecture de menus.

Le truc un peu vicieux, c'est que ce n'est pas la même propriété qui définit la collection selon qu'on se trouve au niveau le plus haut (les commandes principales de la barre de menus) ou à un niveau inférieur.

  • si l'on se trouve au niveau le plus élevé, la collection est définie par la propriété Items du MenuStrip.
  • si l'on se trouve dans un des niveaux inférieurs, la collection est définie par la propriété DropDownItems du ToolStripMenuItem

Dit d'une autre manière : pour définir une collection, la classe MenuStrip possède une propriété Items, tandis que la classe ToolStripMenuItem possède une propriété DropDownItems.

Une fois qu'on sait cela, tout roule.

2. Diverses choses à savoir

  • Pour introduire une barre de séparation entre deux menus placés verticalement l'un sous l'autre, il suffit de créer un élément possédant comme propriété Text un simple tiret (celui du signe de la soustraction). Attention, dans ce cas, l'élément ne relève plus de la classe ToolStripMenuItem, mais de ToolStripSeparator. Du coup, ça complique un peu les choses si on écrit des boucles...
  • Pour associer à un menu une touche de raccourci (celle qui permettra, conjointement à la touche Alt, Shift ou Control, de déclencher la commande en question), on va pouvoir utiliser les propriétés ShortCut et ShowShortCut. La première permet d'attribuer une combinaison de touches du clavier à un menu, et la seconde de les afficher à côté du menu en question. C'est tellement simple qu'il n'y a rien de plus à en dire.
  • Il est aussi possible (bien que rare) de faire apparaître, en face d'un élément de menu, une petite marque pour montrer que l'option a été validée (qu'on pense, par exemple, dans LibreOffice Calc, aux commandes Affichage – En-têtes de colonnes/lignes). Cela s'effectuera via la propriété Checked, dont on passera la valeur à True.
  • Et pour terminer, le principal événement lié aux menus est sans surprise le Click.

3. Menus contextuels

Il s'agit de ces menus qui apparaissent lors d'un clic droit de la souris, et dont le contenu varie selon l'endroit où se trouve le curseur. C'est « menus clic droit », comme on les appelle parfois, sont un moyen privilégié une interface réussie et conviviale. Il faut donc absolument connaître cette technique, d'autant qu'elle est très facile à mettre en œvre.

Pour qu'un ou plusieurs contrôles disposent d'un menu contextuel :

  1. on pose sur la Form autant de contrôles ContextMenuStrip qu'on aura besoin de menus contextuels différents.
  2. on édite chacun de ces ContextMenuStrip, en y créant les différents éléments voulus, via la même interface que pour les StripMenu.
  3. on affecte à chaque contrôle le ContextMenuStrip qui lui revient par sa propriété... ContextMenu.

Et le tour est joué !

À noter qu'un ContextMenu génère un événement PopUp lorsqu'il apparaît, et que tout comme pour un menu ordinaire, le clic sur l'un de ses éléments provoque un événement... Click.

Je vous l'avais bien dit, c'était un petit chapitre tranquille.

Soyons clairs, l'exercice qui suit est une vacherie.
Pas à cause de la structure des menus, qui se construit facilement grâce au concepteur dont nous venons de parler.
Mais le branchement de chaque élément de menu ainsi créé, même s'il peut laborieusement être fait à la main, devra être ici entièrement programmé.
La difficulté réside tout entière dans l'exploration des collections de menus, des sous-collections dans les collections, et des sous-sous-collections dans les collections... car pour cela, la meilleure technique consiste à employer un traitement récursif.
C'est un peu difficile quand on n'a pas l'habitude, et on n'en a pas fait souvent, mais il y a des situations où cette technique est très difficilement contournable... la preuve !
Exercice

Exécutable

Sources

Au tord-Boyaux