Création de menus dynamiques dans vos applications .NET

Frank C. Rice
Microsoft Corporation

S'applique à :
    Microsoft Visual Studio® .NET
    Microsoft Office Excel 2003

Résumé : Frank Rice décrit comment utiliser le contrôle MainMenu pour créer des menus personnalisés basés sur des sélections de menu, au moment de la conception et par programme, permettant une présentation plus professionnelle et polyvalente de votre application.

Sommaire

Introduction
Création d'un menu lors de la conception
Raccordement des événements
Création du menu alternatif
Ajout de la fonctionnalité de menu restante
Test de l'application
Création d'un menu par programme
Création de menus alternatifs par programme
Conclusion

Introduction

Les applications créées avec Microsoft NET peuvent présenter des menus différents pour des contextes différents (ou des états d'application différents). Les structures de menu sont créées sur les formulaires Microsoft NET à l'aide du contrôle MainMenu. Ce dernier représente le contenu de la structure de menu d'un formulaire. Un menu est composé d'objets MenuItem qui représentent les commandes de menu individuelles dans la structure de menu. Chaque objet MenuItem peut être une commande pour votre application ou un menu parent pour d'autres éléments du sous-menu. Pour relier le contrôle MainMenu au formulaire qui l'affichera, affectez-le à la propriété Menu du formulaire.

Il est possible d'avoir plusieurs objets MainMenu, chacun présentant différents choix de menu pour l'utilisateur. Lorsque vous disposez d'un certain nombre d'objets MainMenu pour présenter la structure de menu correcte à l'utilisateur, vous pouvez gérer les différents états de votre application lors de l'interaction avec les utilisateurs.

Dans la procédure qui suit, vous allez créer une structure de menu à utiliser lorsque l'application s'ouvre et qu'il n'existe pas de fichier ou de données avec lesquels l'utilisateur puisse interagir. Ainsi, l'application présentera uniquement un menu Fichier traditionnel avec des commandes Nouveau, Ouvrir et Quitter. Quand l'utilisateur sélectionne l'élément de menu Nouveau, un classeur vierge Microsoft Office Excel 2003 s'ouvre. Lorsque l'utilisateur sélectionne l'élément de menu Ouvrir, un classeur vierge Excel s'ouvre avec des données rudimentaires. Les éléments de menu Nouveau et Ouvrir déclenchent tous deux un changement d'état d'application qui affiche une seconde structure de menu avec des éléments de menu supplémentaires (Close Workbook (Fermer classeur) et Aperçu avant impression) qui ciblent la feuille Excel.

Création d'un menu lors de la conception

Dans les étapes suivantes, vous allez concevoir une application Microsoft Windows®, dans le concepteur Windows Forms, qui permute les structures de menu.

  1. Démarrez Microsoft Visual Studio®.NET, et créez une nouvelle application Windows Visual Basic®.
  2. Ajoutez une référence à la bibliothèque d'objets Microsoft Excel. Pour cela, effectuez les étapes suivantes :
    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Cliquez sur l'onglet COM, localisez la bibliothèque d'objets Microsoft Excel et cliquez sur Sélectionner.
    3. Cliquez sur OK dans la boîte de dialogue Ajouter une référence pour accepter vos sélections.
  3. Faites glisser un composant MainMenu de la boîte à outils vers le formulaire, comme illustré à la figure 1.

composant MainMenu sur le formulaire

Figure 1 : composant MainMenu sur le formulaire

  1. Dans le Concepteur de menu, créez un élément de menu de niveau supérieur avec la propriété Texte définie sur &Fichier (en renseignant la boîte de dialogue Tapez ici) et trois éléments de sous-menu avec la propriété Texte définie sur &Nouveau, &Ouvrir, et F&ermer, dans cet ordre.

  2. Cliquez sur chacun des éléments de menu et affectez la propriété Nom, comme illustré dans la table suivante : Création d'un menu lors de la conception

    Nom par défaut Nouveau nom
    MenuItem1 Fichier
    MenuItem2 Nouveau
    MenuItem3 Ouvrir
    MenuItem4 Quitter
  3. Dans le Concepteur Windows Forms, cliquez sur le formulaire (Form1.vb) pour l'agrandir. Dans la fenêtre Propriétés, assurez-vous que la propriété Menu est définie sur le menu que vous venez de créer (MainMenu1).

Raccordement des événements

Dans .NET, le même gestionnaire d'événements peut recevoir plusieurs événements pointant sur la même fonction. On appelle ce type de gestionnaire un gestionnaire d'événements multicast.

  1. Créez un gestionnaire d'événements multicast pour les deux éléments de menu Quitter (l'un existant déjà et l'autre que vous créerez sous peu) en ajoutant le code suivant :

    Remarque   Vous pouvez créer le shell pour cette procédure en double-cliquant sur l'élément de menu Quitter et en ajoutant Exit2.Click après la directive Handles Excel1.Click.

Private Sub Exit_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Exit.Click, _ Exit1.Click ' Shut down Excel. oXL.Quit() oXL = Nothing End Sub

Dans cette sous-routine, les deux événements **Click** qui suivent le mot-clé **Handles** signifient que lorsque l'on clique sur l'un ou l'autre des éléments de menu **Quitter**, l'instruction qui ferme Form1 est exécutée.
  1. Ensuite, dans l'éditeur de code, créez une méthode similaire à la suivante, pour définir le menu du formulaire sur le second composant MainMenu que vous allez créer dans les étapes suivantes.
Private Sub LoadSecondMenu()
 Me.Menu = MainMenu2
End Sub

Création du menu alternatif

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur le nom du formulaire et sélectionnez Concepteur de vues dans le menu contextuel.

  2. Dans la barre d'état des composants, cliquez sur l'icône du composant MainMenu1 afin qu'il s'agrandisse dans le formulaire, comme illustré à la figure 2 ci-dessous.

    Figure 2. Barre d'état des composants

  3. Dans le Concepteur de menus, cliquez sur l'élément de menu de niveau supérieur que vous avez créé (Fichier). Cliquez avec le bouton droit de la souris et sélectionnez Copier.

    Remarque   Cette opération permet d'effectuer une copie de l'élément de menu de niveau supérieur et de tous ses éléments de sous-menu.

  4. Faites glisser un autre composant MainMenu de la boîte à outils vers le formulaire.

  5. Dans le Concepteur de menus, cliquez avec le bouton droit de la souris dans la zone Tapez ici et sélectionnez Coller.

  6. Les éléments de menu que vous aviez sélectionnés auparavant dans le premier composant MainMenu sont collés dans le second MainMenu.

  7. Dans le Concepteur de menus, cliquez avec le bouton droit de la souris à gauche de l'élément de menu Quitter et sélectionnez Insérer Nouveau. Recommencez l'opération afin d'insérer deux nouveaux éléments de menu.

  8. Définissez la propriété Texte de ces deux nouveaux éléments de menu sur &Aperçu avant impression et &Close Workbook (&Fermer classeur), dans cet ordre, soit dans la fenêtre Propriétés, soit en cliquant sur l'élément et en écrivant dans l'espace fourni.

    Menu alternatif

    Figure 3. Menu alternatif

  9. Cliquez sur chacun des éléments de menu et affectez la propriété Nom, comme illustré dans la table suivante :

    Nom par défaut Nouveau nom
    MenuItem5 Fichier1
    MenuItem6 Nouveau1
    MenuItem7 Ouvrir1
    MenuItem8 Imprimer
    MenuItem9 Fermer
    MenuItem10 Quitter1

Ajout de la fonctionnalité de menu restante

La sous-routine suivante ouvre une instance d'Excel en utilisant un processus appelé automation. Ce dernier permet aux applications écrites dans des langages comme Visual Basic ou C# (prononcé C dièse) de contrôler d'autres applications à l'aide de programmes. Comme indiqué ici, l'automation vous permet d'effectuer des opérations, telles que la création d'un nouveau classeur et l'ajout de données au classeur. Une fois la feuille de calcul renseignée, la fonction de chargement du menu alternatif est appelée. Ajoutez le code suivant dans la fenêtre Code :

Public oXL As Excel.Application
Private Sub Open_Click(ByVal sender As Object, _
 ByVal e As System.EventArgs) Handles Open.Click, Open1.Click
 Dim oWB As Excel.Workbook
 Dim oSheet As Excel.Worksheet

 oXL = CreateObject("Excel.Application")
 oXL.Visible = True

 ' Get a new workbook.
 oWB = oXL.Workbooks.Add
 oSheet = oWB.ActiveSheet

 ' Add table headers to each column.
 oSheet.Cells(1, 1).Value = "First Name"
 oSheet.Cells(1, 2).Value = "Last Name"

 ' Populate with sample names.
 oSheet.Cells(2, 1).Value = "Nancy"
 oSheet.Cells(2, 2).Value = "Davolio"
 oSheet.Cells(3, 1).Value = "Janet"
 oSheet.Cells(3, 2).Value = "Leverling"

 ' Load the alternate menu.
 LoadSecondMenu()

End Sub

La sous-routine suivante est exécutée lorsque l'utilisateur clique sur l'élément de menu Nouveau et ouvre un classeur vierge avant de charger le menu alternatif. Ajoutez cette sous-routine dans la fenêtre Code :

Private Sub New_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles New.Click, New1.Click
 Dim oWB As Excel.Workbook
 Dim oSheet As Excel.Worksheet

 oXL = CreateObject("Excel.Application")
 oXL.Visible = True

 ' Get a new blank workbook.
 oWB = oXL.Workbooks.Add
 oSheet = oWB.ActiveSheet

 ' Load the alternate menu.
 LoadSecondMenu()
End Sub

La sous-routine suivante est exécutée lorsque l'utilisateur clique sur l'élément de menu Aperçu avant impression. Ajoutez cette procédure dans la fenêtre Code :

Private Sub Print_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles Print.Click
 ' Print Preview menu item.
 oXL.ActiveSheet.PrintPreview()
End Sub 

Pour finir, cette procédure ferme l'instance d'Excel lorsque l'utilisateur clique sur l'élément de menu Close Worksheet (Fermer feuille de calcul). Ajoutez encore une fois cette procédure dans la fenêtre Code :

Private Sub Close_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles Close.Click
 ' Exit menu items.
 Form1.ActiveForm.Close()
End Sub

Test de l'application

Appuyez sur F5 pour exécuter l'application. Le formulaire présente un menu qui contient les éléments de menu Fichier, Nouveau, Ouvrir et Quitter. Si vous cliquez sur Nouveau ou Ouvrir, cela déclenche un événement, géré par les gestionnaires d'événements appropriés. Ces méthodes chargent soit un nouveau classeur vierge, soit un classeur qu'elles renseignent à l'aide de données. Ces méthodes changent également l'état de l'application en appelant la sous-routine LoadSecondMenu. Le changement de l'état de l'application est indiqué par l'ajout de deux éléments de menu, Aperçu avant impression et Close Workbook (Fermer classeur).

Création d'un menu par programme

Outre la création de menus à l'aide du Concepteur Windows Forms, vous pouvez également concevoir une application Windows par programme en utilisant l'objet MainMenu. La sous-routine suivante utilise un objet MainMenu qui s'ouvre lorsque l'application est ouverte pour la première fois. Cet objet dispose uniquement du menu Fichier avec les commandes Nouveau, Ouvrir et Quitter. En outre, le code ci-dessous utilise une méthode Ajouter surchargée qui crée des éléments de menu et leur associe des gestionnaires d'événements.

Remarque   Pour référencer les membres du modèle objet Excel, vous devrez établir un lien avec la bibliothèque d'objets Microsoft Excel comme décrit à la section Création d'un menu lors de la conception.

' Create a MainMenu object and a MenuItem object.
Private mmAppStart as MainMenu
Private miFile as MenuItem
Public Sub AppStartMenu()
 ' Create an instance of the MainMenu object.
 mmAppStart = new MainMenu

 ' Create a top-level menu item and two menu items. Use this
 ' overloaded constructor that takes an event handler
 ' (MenuSelect) so that later, you can cause the menu 
 ' selection to change the application state.
 miFile = New MenuItem("&File", _
 New System.EventHandler (AddressOf Me.MenuSelect))
 miFile.MenuItems.Add("&New", _
 New System.EventHandler (AddressOf Me.MenuSelect))
 miFile.MenuItems.Add("&Open", _
 New System.EventHandler (AddressOf Me.MenuSelect))
 miFile.MenuItems.Add("&Exit")

 ' Add the top-level menu item to the MainMenu component 
 ' and set the MainMenu component to be the form's menu.
 mmAppStart.MenuItems.Add(miFile)

 ' Set the form's menu to the menu you have just created.
 Me.Menu = mmAppStart
End Sub

Création de menus alternatifs par programme

Cette procédure crée une seconde instance d'un composant MainMenu avec des éléments de menu qui correspondent à un second état d'application. Dans ce cas, après que l'utilisateur a ouvert un fichier, vous pouvez exposer les commandes pour l'aperçu avant impression de la feuille de calcul et pour la fermeture du classeur.

' Create the alternate MainMain object.
Private mmFileLoadedMenu As MainMenu
Public Sub FileLoadedMenu()
 mmFileLoadedMenu = New MainMenu()
 
 ' Clone the first menu with the CloneMenu method.
 mmFileLoadedMenu.MenuItems.Add(miFile.CloneMenu())
 
 ' Create two additional menu items related to the 
 ' application state.
 Dim mnuitemPrintPre As New MenuItem("&Print_Preview", _
 New System.EventHandler(AddressOf Me.MenuSelect))
 Dim mnuitemClose As New MenuItem("&Close_Workbook", _
 New System.EventHandler(AddressOf Me.MenuSelect)) 
 ' Add the two new menu items to the MenuItems collection of the 
 ' top-level menu item cloned above, using the Add method to
 ' specify their order within the collection by their index.
 mmFileLoadedMenu.MenuItems(0).MenuItems.Add((2), mnuitemPrintPre)
 mmFileLoadedMenu.MenuItems(0).MenuItems.Add((3), mnuitemClose)
 
 ' Assign the newly-created MainMenu object to the form.
 Me.Menu = mmFileLoadedMenu
End Sub

Ajoutez une ligne de code au constructeur Form1, après l'appel de la méthode InitializeComponent, pour appeler la méthode AppStartMenu créée auparavant :

AppStartMenu()

Ensuite, créez un gestionnaire d'événements dans la classe pour ajouter une fonctionnalité à chacun des éléments de menu et pour définir la propriété Menu du formulaire sur FileLoadedMenu. Cette sous-routine ajoute la fonctionnalité en utilisant l'instruction Select Case..End Select basée sur la valeur de l'élément de menu qui a été sélectionné :

Protected Sub MenuSelect(ByVal sender As Object, _
 ByVal e As System.EventArgs)
 Dim itemClicked As New MenuItem()
 itemClicked = CType(sender, MenuItem)
 ' Console.WriteLine("You have selected the item " & _
 itemClicked.Text)

 Select Case itemClicked.Text
 Case "&New"
 Dim oWB As Excel.Workbook
 Dim oSheet As Excel.Worksheet

 oXL = CreateObject("Excel.Application")
 oXL.Visible = True

 ' Get a new blank workbook.
 oWB = oXL.Workbooks.Add
 oSheet = oWB.ActiveSheet
 Case "&Open"
 Dim oWB As Excel.Workbook
 Dim oSheet As Excel.Worksheet

 oXL = CreateObject("Excel.Application")
 oXL.Visible = True

 ' Get a new workbook.
 oWB = oXL.Workbooks.Add
 oSheet = oWB.ActiveSheet

 ' Add table headers to each column.
 oSheet.Cells(1, 1).Value = "First Name"
 oSheet.Cells(1, 2).Value = "Last Name"

 ' Populate with sample names.
 oSheet.Cells(2, 1).Value = "Nancy"
 oSheet.Cells(2, 2).Value = "Davolio"
 oSheet.Cells(3, 1).Value = "Janet"
 oSheet.Cells(3, 2).Value = "Leverling"
 Case "E&xit"
 ' Shut down Excel.
 oXL.Quit()
 oXL = Nothing
 Case "&Print_Preview"
 oXL.ActiveSheet.PrintPreview()
 Case "&Close_Workbook"
 Form1.ActiveForm.Close()
 End Select
 FileLoadedMenu()
End Sub

Conclusion

Dans cet article, nous avons étudié deux façons d'ajouter des menus dans vos applications NET. L'une d'elles a consisté à créer des menus lors de la conception. L'autre méthode a permis de créer des menus lors de l'exécution en créant le menu par programme. L'une et/ou l'autre méthode peu(ven)t convenir en fonction de vos applications. Grâce aux techniques décrites dans cet article, vous pourrez rendre vos applications NET plus adaptables.

Frank Rice est programmeur rédacteur pour le Centre de développement Microsoft Office, au sein duquel il participe à l'élaboration du contenu des documents de développement. Auparavant, il a occupé les postes de développeur d'applications Access et d'ingénieur du support technique Access.

Dernière mise à jour le lundi 4 août 2003