Apprenez à programmer en VB .NET
Last updated on Monday, June 24, 2013
  • 4 semaines
  • Facile

Free online content available in this course.

Paperback available in this course

eBook available in this course.

Got it!

Les menus

Dans ce chapitre, nous allons parler d'un élément important : les menus. Vous savez, les menus, la barre en haut de votre navigateur favori par exemple, avec Fichier, Édition, etc. Et celle juste en dessous, avec les images (la barre d'outils) !

Encore une fois, l'IDE nous mâche le travail ; vous allez voir !

Présentation des menus

Vous devez voir dans votre boîte à outils un sous-menu Menus et barres d'outils, semblable à la figure suivante. Comme vous pouvez le constater, ces objets nous permettront de créer : des menus (1), une barre d'outils (2), une barre de statut (3) et un menu contextuel (4) (menu que vous voyez s'afficher lors du clic droit sur la souris).

Il est possible de créer toutes sortes de menus
Il est possible de créer toutes sortes de menus

Passons tout de suite au menu le plus intéressant : la barre de menus (1) !

La barre de menus

Création graphique

Comme je vous l'ai dit, L'IDE va grandement nous mâcher le travail : un assistant est fourni avec pour créer ces menus. Prenez l'objet MenuStrip et insérez-le sur votre feuille (feuille vide de préférence), comme à la figure suivante.

Insérez l'objet MenuStrip sur votre feuille
Insérez l'objet MenuStrip sur votre feuille

Vous voyez donc que ce menu se place automatiquement en haut de votre feuille. Vous ne le voulez pas en haut ? Vous êtes pénibles ! Pas de problème, une propriété permet de choisir la position dans la feuille de ce menu (gauche, droite, etc.), ou un superbe objet : le ToolStripContainer.

Cette propriété est Dock, et comme notre IDE est gentil, il nous offre la possibilité de paramétrer cette propriété en cliquant sur la petite flèche en haut à droite de notre menu, comme à la figure suivante.

Il est possible de paramétrer la propriété
Il est possible de paramétrer la propriété

Bon, passons au remplissage de ce menu !

Comme vous le voyez, lorsqu'il est sélectionné, le menu vous affiche un petit « Tapez ici » (non, ne sortez pas votre marteau !), comme quoi c'est on ne peut plus facile !

La première « ligne » correspond aux menus principaux (comme Fichier, Édition…). Écrivez donc le nom de votre premier menu (pour moi ce sera Fichier :p ). Vous devez voir lors de l'écriture de ce premier menu deux cases supplémentaires (qui sont également masochistes apparemment), celle du dessous correspond au premier sous-menu de notre premier menu (Fichier -> Nouveau par exemple), la seconde est celle qui nous permet de créer un second menu.

Ne grillons pas les étapes, remplissons déjà notre premier menu !

Pour moi ce sera Reset, et celui en dessous, Quitter.

Il y a encore des « Tapez » qui apparaissent, je fais quoi ?

Eh bien, ces cases permettent de créer des sous-menus qui vous offrent plusieurs choix.

Comme vous allez le voir, la possibilité de créer notre menu entièrement personnalisé est bien réelle !

Bon, je crée un second menu (voir figure suivante), faites de même.

Créez un second menu
Créez un second menu

Puis, pour finir un petit label au centre de la feuille : LBL_TEXTE.

Événements

Maintenant, attaquons la gestion des événements !

Ces événements seront créés grâce à l'assistant Visual Studio comme le clic sur un bouton : un double-clic sur le sous-menu que vous voulez gérer, le code s'ajoute automatiquement :

Private Sub BonjourToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BonjourToolStripMenuItem.Click

End Sub

Faites cela pour tous les sous-menus (sinon à quoi ça sert de les créer :p ).

Je peux le faire sur les menus comme Fichier aussi ?

Oui bien sûr, si vous en trouvez l'utilité !

Bon, voilà donc le code dûment rempli :

Public Class Form1

    Private Sub ResetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResetToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = ""
    End Sub

    Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click
        End
    End Sub

    Private Sub BonjourToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BonjourToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = "Bonjour !"
    End Sub

    Private Sub AuRevoirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AuRevoirToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = "Au revoir."
    End Sub

    Private Sub CiaoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CiaoToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = "Ciao."
    End Sub

    Private Sub ByeByeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ByeByeToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = "Bye bye."
    End Sub

    Private Sub AstalavistaBabyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AstalavistaBabyToolStripMenuItem.Click
        Me.LBL_TEXTE.Text = "Astalavista baby !"
    End Sub

End Class

Eh oui, tant de lignes pour si peu ! Je pense que vous avez compris l'utilité ce que doit faire le programme : lors du clic sur un sous-menu de Afficher, il affiche ce texte, lors du clic sur Reset, il efface, et lors du clic sur Quitter, il quitte le programme (le End effectuant cette action).

Bon, vous vous souvenez des MsgBox ?

Eh bien, elles vont nous être utiles ici : nous allons mettre une confirmation de sortie du programme.

Je pense que vous êtes capables de le faire par vous-mêmes, mais bon, je suis trop aimable :

If MsgBox("Souhaitez-vous vraiment quitter ce magnifique programme ?", 36, "Quitter") = MsgBoxResult.Yes Then
   End
End If

Pourquoi 36 en deuxième argument ?

Vous ne vous en souvenez pas ? Je vous redonne le tableau :

Membre

Valeur

Description

OKOnly

0

Affiche le bouton « OK » uniquement.

OKCancel

1

Affiche les boutons « OK » et « Annuler ».

AbortRetryIgnore

2

Affiche les boutons « Abandonner », « Réessayer » et « Ignorer ».

YesNoCancel

3

Affiche les boutons « Oui» , « Non » et « Annuler ».

YesNo

4

Affiche les boutons « Oui » et « Non ».

RetryCancel

5

Affiche les boutons « Réessayer » et « Annuler ».

Critical

16

Affiche l'icône « Message critique ».

Question

32

Affiche l'icône « Requête d'avertissement ».

Exclamation

48

Affiche l'icône « Message d'avertissement ».

Information

64

Affiche l'icône « Message d'information ».

DefaultButton1

0

Le premier bouton est le bouton par défaut.

DefaultButton2

256

Le deuxième bouton est le bouton par défaut.

DefaultButton3

512

Le troisième bouton est le bouton par défaut.

ApplicationModal

0

L'application est modale. L'utilisateur doit répondre au message avant de poursuivre le travail dans l'application en cours.

SystemModal

4096

Le système est modal. Toutes les applications sont interrompues jusqu'à ce que l'utilisateur réponde au message.

MsgBoxSetForeground

65536

Spécifie la fenêtre de message comme fenêtre de premier plan.

Et voilà votre programme qui affiche ce que vous voulez et qui vous demande une confirmation de fermeture, comme le montre la figure suivante.

Le programme demande confirmation avant de se fermer
Le programme demande confirmation avant de se fermer

Les différents contrôles des menus

Je viens de vous montrer un menu classique avec du texte comme contrôle, mais vous en voulez sûrement plus. Eh bien, c'est parti : nous allons créer des combobox (listes déroulantes) et des textbox.

Dans le menu ??

Eh bien oui ! Vous ne devez pas en voir souvent, mais ça peut être utile !

Donc, pour avoir accès à ces contrôles supplémentaires, il faut cliquer sur la petite flèche disponible à côté du « Tapez ici » (voir figure suivante).

« Tapez ici »
« Tapez ici »

Vous voyez que s'offrent à vous les contrôles tant désirés ! Eh bien, personnalisons un peu notre menu pour arriver à la figure suivante.

Ce que nous devons obtenir
Ce que nous devons obtenir

Sachant que dans la combobox Message prédéfini j'ai remis les messages d'avant (vous devez vous servir de la propriété collection de cette combobox, du côté design, pour en assigner les choix ou alors passer par le code VB, au choix).

Schématiquement :

  • Fichier

    • Reset

    • Quitter

  • Affichage

    • Message prédéfini

      • Combobox

        • Bonjour !

        • Au revoir.

        • Ciao.

        • Bye bye.

        • Astalavista baby !

    • Message personnalisé

      • Textbox

      • Écrire

Ce qui est assez gênant avec cet assistant, c'est que les noms qui sont entrés automatiquement sont assez coton à repérer ; avec une textbox, une combobox, ça passe, mais au-delà, aïe ! Alors prenez l'habitude de les renommer : un tour sur les propriétés et on change : CB_MENU et TXT_MENU.

Bon, ensuite on utilise notre fidèle assistant pour créer les événements correspondants : sur le clic du bouton Écrire et lors du changement de la combobox.

Si vous avez utilisé l'assistant pour créer l'événement de la combobox, lorsqu'elle est dans un menu, l'événement est le Clic, il faut le changer :

Private Sub CB_MENU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_MENU.SelectedIndexChanged

Supprimez les événements relatifs aux anciens sous-menus (Bonjour…), mais gardez ceux correspondant aux sous-menus Reset et Quitter.

Écrivons maintenant notre code : côté combobox, on veut afficher le texte correspondant à l'item de la combobox (je vous ai donné la solution là :p ), eh oui, l'événement SelectedItem sera utilisé, le SelectedValue n'étant pas disponible dans cette façon d'utiliser la combobox.

Ce qui nous donne :

Private Sub CB_MENU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_MENU.SelectedIndexChanged
        Me.LBL_TEXTE.Text = Me.CB_MENU.SelectedItem
    End Sub

Bon, pour notre bouton Écrire, ce n'est pas sorcier : on récupère la valeur de la textbox et on l'affiche ; voilà le tout :

Public Class Form1

    Private Sub ResetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResetToolStripMenuItem.Click
        'Efface le label
        Me.LBL_TEXTE.Text = ""
    End Sub

    Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click
        'Fermeture avec confirmation
        If MsgBox("Souhaitez-vous vraiment quitter ce magnifique programme ?", 36, "Quitter") = MsgBoxResult.Yes Then
            End
        End If
    End Sub

    Private Sub CB_MENU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_MENU.SelectedIndexChanged
        'Écrit le texte de la combobox lors du changement d'index
        Me.LBL_TEXTE.Text = Me.CB_MENU.SelectedItem
    End Sub

    Private Sub EcrireToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EcrireToolStripMenuItem.Click
        'Écrit le texte de la textbox lors de l'appui sur « Écrire »
        Me.LBL_TEXTE.Text = Me.TXT_MENU.Text
    End Sub
End Class

Et voici le rendu final à la figure suivante.

Notre rendu !
Notre rendu !

Comme vous voyez, le VB est assez facile à utiliser dans différentes situations puisque les propriétés ne changent pas. Bon, maintenant que vous savez ça, on ne se repose pas sur ses lauriers, on avance. ^^

La barre de statut

Au tour de la barre de statut. Il s'agit de la barre qui vous indique… le statut de l'application. À quoi va nous servir cette barre ? Eh bien à afficher le statut de votre application par exemple, ou alors tout simplement à mettre des boutons dessus ! :p Je vais vous montrer une manière d'utiliser à bon escient cette barre, après, à vous de faire ce que vous voulez et de trifouiller toutes ses propriétés !

Créons déjà ladite barre : toujours dans le menu Menus et barres d'outils, vous choisissez StatusStrip. Vous l'intégrez à la feuille, elle se place en bas (normal), vous pouvez changer en agissant encore une fois sur la propriété Dock. Ajoutez deux contrôles : un label et une progressbar. La progressbar est accessible, comme pour la combobox de la partie précédente, avec la petite flèche. Renommez-les : LBL_STATUT, PGB_STATUT.

Nous allons nous servir de la progressbar comme indication d'avancement. Évidemment, ici, afficher un label n'est pas sorcier, notre ordinateur ne va pas réfléchir plus d'une milliseconde (oui, même sous Windows 3.1). Nous allons donc simuler une pause.

Recréons donc un petit timer pour simuler le temps d'attente (TIM_STATUT) et utilisons le même procédé que lors du chapitre sur les timers. Nous allons donc faire progresser la barre et afficher dans le label le statut. C'est un exercice que vous pouvez évidemment faire.

Voici donc une solution :

Public Class Form1

    Private Sub ResetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResetToolStripMenuItem.Click
        'Efface le label
        PauseFactice()
        Me.LBL_TEXTE.Text = ""

    End Sub

    Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click
        'Fermeture avec confirmation
        If MsgBox("Souhaitez-vous vraiment quitter ce magnifique programme ?", 36, "Quitter") = MsgBoxResult.Yes Then
            End
        End If
    End Sub

    Private Sub CB_MENU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_MENU.SelectedIndexChanged
        'Écrit le texte de la combobox lors du changement d'index
        PauseFactice()
        Me.LBL_TEXTE.Text = Me.CB_MENU.SelectedItem

    End Sub

    Private Sub EcrireToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EcrireToolStripMenuItem.Click
        'Écrit le texte de la textbox lors de l'appui sur « Écrire »
        PauseFactice()
        Me.LBL_TEXTE.Text = Me.TXT_MENU.Text

    End Sub

    Private Sub PauseFactice()
        LBL_STATUT.Text = "Chargement ..."
        PGB_STATUT.Value = 0
        TIM_STATUT.Enabled = True
    End Sub

    Private Sub TIM_STATUT_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_STATUT.Tick
        'Si la progressbar est arrivée au bout, on désactive le timer
        If Me.PGB_STATUT.Value = 100 Then
            Me.TIM_STATUT.Enabled = False
            LBL_STATUT.Text = "Prêt"
        Else
            'Augmente de 1 la progressbar
            Me.PGB_STATUT.Value = Me.PGB_STATUT.Value + 1
        End If
    End Sub

End Class

Bon, pour ce code, je ne me suis pas trop fatigué : j'ai copié le code du chapitre sur les timers. La « pause » n'est pas effectuée donc le texte s'affiche pendant la progression. C'est un exemple, vous pourrez utiliser les barres de chargement en situation réelle plus tard. L'idéal aurait été de placer un sémaphore (un flag), le tout avec une boucle While. Le rendu se trouve à la figure suivante.

Notre barre de chargement
Notre barre de chargement

Alors ce code n'est pas dur à comprendre : j'ai mélangé le code de progression avec le code existant, en ajoutant des repères grâce au label : le « Chargement…» et le « Prêt ». Comme d'habitude, essayez de modifier ce code pour le rendre plus efficace et comme vous le souhaitez.

Le menu contextuel

Alors, le menu contextuel est, comme je vous l'ai expliqué, le menu visible lors du clic droit. Nous allons créer un contextmenu, toujours dans la suite de notre programme qui va déplacer le label qui nous sert à afficher le texte.

Donc, toujours dans le menu de la boîte à outils : Menus et barres d'outils, vous prenez le ContextMenuStrip et vous l'intégrez à la feuille. Une fois cela fait, créez un élément contenant le texte : « Déplacer le label ici ». Ensuite, comme à l'accoutumée, on crée son événement correspondant. Dans cet événement, nous allons récupérer la position du curseur et changer la propriété location du label :

Me.LBL_TEXTE.Location = Control.MousePosition

Control.MousePosition est la propriété de position de la souris (Control). Eh oui, même la souris a des propriétés, vous en rêviez, n'est-ce pas ?

Et donc voilà, une fois tout le code bien agencé :

Public Class Form1

    Private Sub ResetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResetToolStripMenuItem.Click
        'Efface le label
        PauseFactice()
        Me.LBL_TEXTE.Text = ""

    End Sub

    Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click
        'Fermeture avec confirmation
        If MsgBox("Souhaitez-vous vraiment quitter ce magnifique programme ?", 36, "Quitter") = MsgBoxResult.Yes Then
            End
        End If
    End Sub

    Private Sub CB_MENU_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_MENU.SelectedIndexChanged
        'Écrit le texte de la combobox lors du changement d'index
        PauseFactice()
        Me.LBL_TEXTE.Text = Me.CB_MENU.SelectedItem

    End Sub

    Private Sub EcrireToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EcrireToolStripMenuItem.Click
        'Écrit le texte de la textbox lors de l'appui sur « Écrire »
        PauseFactice()
        Me.LBL_TEXTE.Text = Me.TXT_MENU.Text

    End Sub

    Private Sub PauseFactice()
        LBL_STATUT.Text = "Chargement ..."
        PGB_STATUT.Value = 0
        TIM_STATUT.Enabled = True
    End Sub

    Private Sub TIM_STATUT_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_STATUT.Tick
        'Si la progressbar est arrivée au bout, on désactive le timer
        If Me.PGB_STATUT.Value = 100 Then
            Me.TIM_STATUT.Enabled = False
            LBL_STATUT.Text = "Prêt"
        Else
            'Augmente de 1 la progressbar
            Me.PGB_STATUT.Value = Me.PGB_STATUT.Value + 1
        End If
    End Sub

    Private Sub DéplacerLeLabelIciToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DéplacerLeLabelIciToolStripMenuItem.Click
        'lors d'un clic droit et du choix de déplacement du label, on place le label aux positions de la souris.
        Me.LBL_TEXTE.Location = Control.MousePosition
    End Sub
End Class

Lors d'un clic et de la sélection, le label bouge. Ce programme était là pour vous montrer les utilisations des différents menus, il est bien évidemment inutile (donc indispensable) !

  • Il existe des menus contextuels, des barres de menus, des barres d'outils…

  • Le menu contextuel apparaît lors du clic droit de la souris.

  • Les menus sont réservés aux applications volumineuses et nécessitant une grande interaction avec l'utilisateur.

Example of certificate of achievement
Example of certificate of achievement