Ajouter un contrôleur de menu à une barre d’outils

Cette procédure pas à pas s’appuie sur la procédure pas à pas Ajouter une barre d’outils à une fenêtre d’outils et montre comment ajouter un contrôleur de menu à la barre d’outils de la fenêtre d’outils. Les étapes présentées ici peuvent également être appliquées à la barre d’outils créée dans la procédure pas à pas Ajouter une barre d’outils .

Un contrôleur de menu est un contrôle fractionné. Le côté gauche du contrôleur de menu affiche la dernière commande utilisée et vous pouvez l’exécuter en cliquant dessus. Le côté droit du contrôleur de menu est une flèche qui, quand vous cliquez dessus, ouvre une liste de commandes supplémentaires. Lorsque vous cliquez sur une commande dans la liste, la commande s’exécute et remplace la commande sur le côté gauche du contrôleur de menu. De cette façon, le contrôleur de menu fonctionne comme un bouton de commande qui affiche toujours la dernière commande utilisée à partir d’une liste.

Les contrôleurs de menu peuvent apparaître dans les menus, mais ils sont les plus souvent utilisés dans les barres d’outils.

Créer un contrôleur de menu

  1. Suivez les procédures décrites dans Ajouter une barre d’outils à une fenêtre d’outils pour créer une fenêtre d’outil qui a une barre d’outils.

  2. Dans TWTestCommandPackage.vsct, accédez à la section Symboles. Dans l’élément GuidSymbol nommé guidTWTestCommandPackageCmdSet, déclarez votre contrôleur de menu, votre groupe de contrôleurs de menus et trois éléments de menu.

    <IDSymbol name="TestMenuController" value="0x1300" /><IDSymbol name="TestMenuControllerGroup" value="0x1060" /><IDSymbol name="cmdidMCItem1" value="0x0130" /><IDSymbol name="cmdidMCItem2" value="0x0131" /><IDSymbol name="cmdidMCItem3" value="0x0132" />
    
  3. Dans la section Menus, après la dernière entrée de menu, définissez le contrôleur de menu en tant que menu.

    <Menu guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" priority="0x0100" type="MenuController">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TWToolbarGroup" />
        <CommandFlag>IconAndText</CommandFlag>
        <CommandFlag>TextChanges</CommandFlag>
        <CommandFlag>TextIsAnchorCommand</CommandFlag>
        <Strings>
            <ButtonText>Test Menu Controller</ButtonText>
            <CommandName>Test Menu Controller</CommandName>
        </Strings>
    </Menu>
    

    Les indicateurs et TextIsAnchorCommand les TextChanges indicateurs doivent être inclus pour permettre au contrôleur de menu de refléter la dernière commande sélectionnée.

  4. Dans la section Groupes, après la dernière entrée de groupe, ajoutez le groupe de contrôleurs de menus.

    <Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" />
    </Group>
    

    En définissant le contrôleur de menu comme parent, toutes les commandes placées dans ce groupe apparaissent dans le contrôleur de menu. L’attribut priority est omis, qui le définit sur la valeur par défaut 0, car il s’agit du seul groupe sur le contrôleur de menu.

  5. Dans la section Boutons, après la dernière entrée de bouton, ajoutez un élément Button pour chacun de vos éléments de menu.

    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem1" priority="0x0000" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 1</ButtonText>
            <CommandName>MC Item 1</CommandName>
        </Strings>
    </Button>
    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem2" priority="0x0100" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPic2" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 2</ButtonText>
            <CommandName>MC Item 2</CommandName>
        </Strings>
    </Button>
    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem3" priority="0x0200" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPicSearch" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 3</ButtonText>
            <CommandName>MC Item 3</CommandName>
        </Strings>
    </Button>
    
  6. À ce stade, vous pouvez examiner le contrôleur de menu. Générez le projet et commencez le débogage. Vous devez voir l’instance expérimentale.

    1. Dans le menu Affichage / Autres Fenêtres , ouvrez Test ToolWindow.

    2. Le contrôleur de menu apparaît dans la barre d’outils dans la fenêtre outil.

    3. Cliquez sur la flèche située à droite du contrôleur de menu pour afficher les trois commandes possibles.

      Notez que lorsque vous cliquez sur une commande, le titre du contrôleur de menu change pour afficher cette commande. Dans la section suivante, nous allons ajouter le code pour activer ces commandes.

Implémenter les commandes du contrôleur de menu

  1. Dans TWTestCommandPackageGuids.cs, ajoutez des ID de commande pour vos trois éléments de menu après les ID de commande existants.

    public const int cmdidMCItem1 = 0x130;
    public const int cmdidMCItem2 = 0x131;
    public const int cmdidMCItem3 = 0x132;
    
  2. Dans TWTestCommand.cs, ajoutez le code suivant en haut de la TWTestCommand classe.

    private int currentMCCommand; // The currently selected menu controller command
    
  3. Dans le constructeur TWTestCommand, après le dernier appel à la AddCommand méthode, ajoutez du code pour router les événements de chaque commande via les mêmes gestionnaires.

    for (int i = TWTestCommandPackageGuids.cmdidMCItem1; i <=
        TWTestCommandPackageGuids.cmdidMCItem3; i++)
    {
        CommandID cmdID = new
        CommandID(new Guid(TWTestCommandPackageGuids.guidTWTestCommandPackageCmdSet), i);
        OleMenuCommand mc = new OleMenuCommand(new
          EventHandler(OnMCItemClicked), cmdID);
        mc.BeforeQueryStatus += new EventHandler(OnMCItemQueryStatus);
        commandService.AddCommand(mc);
        // The first item is, by default, checked. 
        if (TWTestCommandPackageGuids.cmdidMCItem1 == i)
        {
            mc.Checked = true;
            this.currentMCCommand = i;
        }
    }
    
  4. Ajoutez un gestionnaire d’événements à la classe TWTestCommand pour marquer la commande sélectionnée comme case activée ed.

    private void OnMCItemQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            mc.Checked = (mc.CommandID.ID == this.currentMCCommand);
        }
    }
    
  5. Ajoutez un gestionnaire d’événements qui affiche un MessageBox lorsque l’utilisateur sélectionne une commande sur le contrôleur de menu :

    private void OnMCItemClicked(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            string selection;
            switch (mc.CommandID.ID)
            {
                case c.cmdidMCItem1:
                    selection = "Menu controller Item 1";
                    break;
    
                case TWTestCommandPackageGuids.cmdidMCItem2:
                    selection = "Menu controller Item 2";
                    break;
    
                case TWTestCommandPackageGuids.cmdidMCItem3:
                    selection = "Menu controller Item 3";
                    break;
    
                default:
                    selection = "Unknown command";
                    break;
            }
            this.currentMCCommand = mc.CommandID.ID;
    
            IVsUIShell uiShell =
              (IVsUIShell) ServiceProvider.GetService(typeof(SVsUIShell));
            Guid clsid = Guid.Empty;
            int result;
            uiShell.ShowMessageBox(
                    0,
                    ref clsid,
                    "Test Tool Window Toolbar Package",
                    string.Format(CultureInfo.CurrentCulture,
                                 "You selected {0}", selection),
                    string.Empty,
                    0,
                    OLEMSGBUTTON.OLEMSGBUTTON_OK,
                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,
                    OLEMSGICON.OLEMSGICON_INFO,
                    0,
                    out result);
        }
    }
    

Test du contrôleur de menu

  1. Générez le projet et commencez le débogage. Vous devez voir l’instance expérimentale.

  2. Ouvrez l’outil Test ToolWindow dans le menu Affichage /Autres Fenêtres .

    Le contrôleur de menu apparaît dans la barre d’outils de la fenêtre outil et affiche MC Item 1.

  3. Cliquez sur le bouton contrôleur de menu à gauche de la flèche.

    Vous devriez voir trois éléments, dont le premier est sélectionné et qui a une zone de mise en surbrillance autour de son icône. Cliquez sur MC Item 3.

    Une boîte de dialogue s’affiche avec le message Que vous avez sélectionné à l’élément 3 du contrôleur de menu. Notez que le message correspond au texte du bouton du contrôleur de menu. Le bouton contrôleur de menu affiche maintenant MC Item 3.