Implémentation de commande

Pour implémenter une commande dans un VSPackage, vous devez effectuer les tâches suivantes :

  1. Dans le fichier .vsct , configurez un groupe de commandes, puis ajoutez-y la commande. Pour plus d’informations, consultez les fichiers de la table de commandes Visual Studio (.vsct).

  2. Inscrivez la commande auprès de Visual Studio.

  3. Implémentez la commande.

Les sections suivantes expliquent comment inscrire et implémenter des commandes.

Inscrire des commandes avec Visual Studio

Si votre commande doit apparaître dans un menu, vous devez l’ajouter ProvideMenuResourceAttribute à votre VSPackage et utiliser comme valeur le nom du menu ou son ID de ressource.

[ProvideMenuResource("Menus.ctmenu", 1)]
...
    public sealed class MyPackage : Package
    {.. ..}

En outre, vous devez inscrire la commande auprès du OleMenuCommandService. Vous pouvez obtenir ce service à l’aide de la GetService méthode si votre VSPackage est dérivé de Package.

OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
    // Create the command for the menu item.
    CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
    MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
    mcs.AddCommand( menuItem );
}

Implémenter des commandes

Il existe plusieurs façons d’implémenter des commandes. Si vous souhaitez une commande de menu statique, qui est une commande qui apparaît toujours de la même façon et dans le même menu, créez la commande à l’aide MenuCommand des exemples de la section précédente. Pour créer une commande statique, vous devez fournir un gestionnaire d’événements responsable de l’exécution de la commande. Étant donné que la commande est toujours activée et visible, vous n’avez pas à fournir son état à Visual Studio. Si vous souhaitez modifier l’état d’une commande en fonction de certaines conditions, vous pouvez créer la commande en tant qu’instance de la OleMenuCommand classe et, dans son constructeur, fournir un gestionnaire d’événements pour exécuter la commande et un QueryStatus gestionnaire pour avertir Visual Studio lorsque l’état de la commande change. Vous pouvez également implémenter IOleCommandTarget dans le cadre d’une classe de commande ou, IVsHierarchy si vous fournissez une commande dans le cadre d’un projet. Les deux interfaces et la OleMenuCommand classe ont toutes des méthodes qui informent Visual Studio d’une modification de l’état d’une commande et d’autres méthodes qui fournissent l’exécution de la commande.

Lorsqu’une commande est ajoutée au service de commandes, elle devient l’une des chaînes de commandes. Lorsque vous implémentez les méthodes de notification d’état et d’exécution de la commande, veillez à fournir uniquement cette commande particulière et à transmettre tous les autres cas aux autres commandes de la chaîne. Si vous ne parvenez pas à transmettre la commande (généralement en retournant OLECMDERR_E_NOTSUPPORTED), Visual Studio peut cesser de fonctionner correctement.

Méthodes QueryStatus

Si vous implémentez la QueryStatus méthode ou la QueryStatusCommand méthode, case activée pour le GUID du jeu de commandes auquel appartient la commande et l’ID de la commande. Procédez comme suit :

  • Si le GUID n’est pas reconnu, votre implémentation de l’une ou l’autre méthode doit retourner OLECMDERR_E_UNKNOWNGROUP.

  • Si votre implémentation de l’une ou l’autre méthode reconnaît le GUID mais n’a pas implémenté la commande, la méthode doit retourner OLECMDERR_E_NOTSUPPORTED.

  • Si votre implémentation de l’une ou l’autre méthode reconnaît à la fois le GUID et la commande, la méthode doit définir le champ indicateurs de commande de chaque commande (dans le prgCmds paramètre) à l’aide des indicateurs suivants OLECMDF :

    • OLECMDF_SUPPORTED: la commande est prise en charge.

    • OLECMDF_INVISIBLE: la commande ne doit pas être visible.

    • OLECMDF_LATCHED: la commande est activée et semble avoir été case activée ed.

    • OLECMDF_ENABLED: la commande est activée.

    • OLECMDF_DEFHIDEONCTXTMENU: la commande doit être masquée si elle apparaît dans un menu contextuel.

    • OLECMDF_NINCHED: la commande est un contrôleur de menu et n’est pas activée, mais sa liste déroulante de menus n’est pas vide et est toujours disponible. (Cet indicateur est rarement utilisé.)

  • Si la commande a été définie dans le fichier .vsct avec l’indicateur TextChanges , définissez les paramètres suivants :

    • Définissez l’élément rgwz du pCmdText paramètre sur le nouveau texte de la commande.

    • Définissez l’élément cwActual du pCmdText paramètre sur la taille de la chaîne de commande.

Vérifiez également que le contexte actuel n’est pas une fonction d’automatisation, sauf si votre commande est spécifiquement destinée à gérer les fonctions d’automatisation.

Pour indiquer que vous prenez en charge une commande particulière, retournez S_OK. Pour toutes les autres commandes, retournez OLECMDERR_E_NOTSUPPORTED.

Dans l’exemple suivant, la QueryStatus méthode vérifie d’abord que le contexte n’est pas une fonction Automation, puis recherche le GUID et l’ID de commande corrects de l’ensemble de commandes. La commande elle-même est définie pour être activée et prise en charge. Aucune autre commande n’est prise en charge.

public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
    if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
    {
        if (pguidCmdGroup == VSConstants.VSStd2K && cCmds > 0)
        {
            // make the Right command visible
            if ((uint)prgCmds[0].cmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
            {
                prgCmds[0].cmdf = (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_ENABLED | (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_SUPPORTED;
                return VSConstants.S_OK;
            }
        }
        return Constants.OLECMDERR_E_NOTSUPPORTED;
    }
}

Méthodes d’exécution

L’implémentation de la Exec méthode ressemble à l’implémentation de la QueryStatus méthode. Tout d’abord, assurez-vous que le contexte n’est pas une fonction d’automatisation. Ensuite, testez le GUID et l’ID de commande. Si le GUID ou l’ID de commande n’est pas reconnu, retournez OLECMDERR_E_NOTSUPPORTED.

Pour gérer la commande, exécutez-la et retournez S_OK si l’exécution réussit. Votre commande est responsable de la détection et de la notification des erreurs ; retourne donc un code d’erreur en cas d’échec de l’exécution. L’exemple suivant montre comment implémenter la méthode d’exécution.

public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
    if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
    {
        if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
        {
             if (nCmdID ==(uint) uint)VSConstants.VSStd2KCmdID.RIGHT)
            {
                //execute the command
                return VSConstants.S_OK;
            }
        }
    }
    return Constants.OLECMDERR_E_NOTSUPPORTED;
}