Sdílet prostřednictvím


Implementace příkazů

Pokud chcete implementovat příkaz v balíčku VSPackage, musíte provést následující úlohy:

  1. V souboru .vsct nastavte skupinu příkazů a pak do ní přidejte příkaz. Další informace najdete v souborech příkazové tabulky sady Visual Studio (.vsct).

  2. Zaregistrujte příkaz v sadě Visual Studio.

  3. Implementujte příkaz.

Následující části popisují, jak zaregistrovat a implementovat příkazy.

Registrace příkazů v sadě Visual Studio

Pokud se má příkaz zobrazit v nabídce, musíte ProvideMenuResourceAttribute přidat do balíčku VSPackage a použít ho jako hodnotu buď název nabídky, nebo jeho ID prostředku.

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

Kromě toho je nutné zaregistrovat příkaz v sadě OleMenuCommandService. Tuto službu můžete získat pomocí GetService metody, pokud je balíček VSPackage odvozen z Package.

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

Implementace příkazů

Existuje několik způsobů, jak implementovat příkazy. Pokud chcete příkaz statické nabídky, což je příkaz, který se vždy zobrazuje stejným způsobem a ve stejné nabídce, vytvořte příkaz pomocí příkazu MenuCommand , jak je znázorněno v příkladech v předchozí části. Chcete-li vytvořit statický příkaz, musíte zadat obslužnou rutinu události, která je zodpovědná za spuštění příkazu. Protože je příkaz vždy povolený a viditelný, nemusíte do sady Visual Studio zadávat jeho stav. Pokud chcete změnit stav příkazu v závislosti na určitých podmínkách, můžete příkaz vytvořit jako instanci OleMenuCommand třídy a v jeho konstruktoru poskytnout obslužnou rutinu události pro spuštění příkazu a obslužnou rutinu QueryStatus , která upozorní Visual Studio, když se změní stav příkazu. Můžete také implementovat IOleCommandTarget jako součást třídy příkazů nebo můžete implementovat IVsHierarchy , pokud jako součást projektu zadáte příkaz. Dvě rozhraní a OleMenuCommand třída mají všechny metody, které sadě Visual Studio oznámí změnu stavu příkazu, a další metody, které poskytují spuštění příkazu.

Když se příkaz přidá do příkazové služby, stane se jedním z řetězu příkazů. Když implementujete metody oznámení o stavu a provádění příkazu, nezapomeňte poskytnout pouze pro tento konkrétní příkaz a předat všechny ostatní případy ostatním příkazům v řetězu. Pokud se vám nepodaří předat příkaz on (obvykle vrácením OLECMDERR_E_NOTSUPPORTED), visual Studio může přestat fungovat správně.

Metody QueryStatus

Pokud implementujete metodu QueryStatus nebo metodu QueryStatusCommand , zkontrolujte identifikátor GUID sady příkazů, do které příkaz patří, a ID příkazu. Postupujte podle těchto pokynů:

  • Pokud identifikátor GUID není rozpoznán, vaše implementace některé z metod musí vrátit OLECMDERR_E_UNKNOWNGROUP.

  • Pokud implementace některé z metod rozpozná identifikátor GUID, ale neimplementoval příkaz, měla by metoda vrátit OLECMDERR_E_NOTSUPPORTED.

  • Pokud vaše implementace některé z metod rozpozná identifikátor GUID i příkaz, měla by metoda nastavit pole command-flags každého příkazu (v parametru prgCmds ) pomocí následujících OLECMDF příznaků:

    • OLECMDF_SUPPORTED: Příkaz je podporovaný.

    • OLECMDF_INVISIBLE: Příkaz by neměl být viditelný.

    • OLECMDF_LATCHED: Příkaz je zapnutý a zdá se, že je zaškrtnuté.

    • OLECMDF_ENABLED: Příkaz je povolený.

    • OLECMDF_DEFHIDEONCTXTMENU: Příkaz by měl být skrytý, pokud se zobrazí v místní nabídce.

    • OLECMDF_NINCHED: Příkaz je kontroler nabídek a není povolený, ale jeho rozevírací seznam nabídek není prázdný a je stále k dispozici. (Tento příznak se používá zřídka.)

  • Pokud byl příkaz definován v souboru .vsct s příznakem TextChanges , nastavte následující parametry:

    • rgwz Nastavte prvek parametru pCmdText na nový text příkazu.

    • cwActual Nastavte prvek parametru pCmdText na velikost příkazového řetězce.

Také se ujistěte, že aktuální kontext není automatizační funkce, pokud váš příkaz není určený speciálně pro zpracování automatizačních funkcí.

Chcete-li označit, že podporujete určitý příkaz, vraťte S_OK. Pro všechny ostatní příkazy vraťte OLECMDERR_E_NOTSUPPORTED.

V následujícím příkladu QueryStatus metoda nejprve ověří, že kontext není automatizační funkce, a pak najde správný identifikátor GUID sady příkazů a ID příkazu. Samotný příkaz je nastavený tak, aby byl povolený a podporovaný. Nejsou podporovány žádné další příkazy.

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;
}

Metody provádění

Exec Implementace metody se podobá implementaci QueryStatus metody. Nejprve se ujistěte, že kontext není automatizační funkce. Pak otestujte identifikátor GUID i ID příkazu. Pokud identifikátor GUID nebo ID příkazu není rozpoznáno, vraťte OLECMDERR_E_NOTSUPPORTED.

Pokud chcete tento příkaz zpracovat, spusťte ho a vraťte S_OK se, pokud je spuštění úspěšné. Váš příkaz zodpovídá za detekci chyb a oznámení; proto vraťte kód chyby, pokud se spuštění nezdaří. Následující příklad ukazuje, jak by měla být implementována metoda provádění.

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)VSConstants.VSStd2KCmdID.RIGHT)
            {
                // execute the command
                return VSConstants.S_OK;
            }
        }
    }
    return Constants.OLECMDERR_E_NOTSUPPORTED;
}