Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Als u een opdracht in een VSPackage wilt implementeren, moet u de volgende taken uitvoeren:
Stel in het VSCT-bestand een opdrachtgroep in en voeg de opdracht eraan toe. Zie Visual Studio-opdrachttabelbestanden (.vsct) voor meer informatie.
Registreer de opdracht bij Visual Studio.
Implementeer de opdracht.
In de volgende secties wordt uitgelegd hoe u opdrachten registreert en implementeert.
Opdrachten registreren bij Visual Studio
Als de opdracht wordt weergegeven in een menu, moet u de ProvideMenuResourceAttribute opdracht toevoegen aan uw VSPackage en deze gebruiken als waarde, ofwel de naam van het menu of de bijbehorende resource-id.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
Daarnaast moet u de opdracht registreren bij de OleMenuCommandService. U kunt deze service ophalen met behulp van de GetService methode als uw VSPackage is afgeleid van 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);
}
Opdrachten implementeren
Er zijn verschillende manieren om opdrachten te implementeren. Als u een statische menuopdracht wilt, een opdracht die altijd op dezelfde manier wordt weergegeven en in hetzelfde menu, maakt u de opdracht met behulp van MenuCommand de voorbeelden in de vorige sectie. Als u een statische opdracht wilt maken, moet u een gebeurtenishandler opgeven die verantwoordelijk is voor het uitvoeren van de opdracht. Omdat de opdracht altijd is ingeschakeld en zichtbaar is, hoeft u de status ervan niet op te geven voor Visual Studio. Als u de status van een opdracht wilt wijzigen, afhankelijk van bepaalde voorwaarden, kunt u de opdracht als exemplaar van de klasse maken en in de OleMenuCommand constructor een gebeurtenishandler opgeven om de opdracht en een QueryStatus handler uit te voeren om Visual Studio op de hoogte te stellen wanneer de status van de opdracht verandert. U kunt ook implementeren IOleCommandTarget als onderdeel van een opdrachtklasse of u kunt implementeren IVsHierarchy als u een opdracht als onderdeel van een project opgeeft. De twee interfaces en de OleMenuCommand klasse hebben allemaal methoden die Visual Studio op de hoogte stellen van een wijziging in de status van een opdracht en andere methoden die de uitvoering van de opdracht bieden.
Wanneer een opdracht wordt toegevoegd aan de opdrachtservice, wordt deze een van een keten van opdrachten. Wanneer u de statusmelding en uitvoeringsmethoden voor de opdracht implementeert, moet u ervoor zorgen dat alleen die specifieke opdracht wordt opgegeven en alle andere gevallen worden doorgegeven aan de andere opdrachten in de keten. Als u de opdracht niet doorgeeft (meestal door terug te keren OLECMDERR_E_NOTSUPPORTED), werkt Visual Studio mogelijk niet meer goed.
QueryStatus-methoden
Als u de QueryStatus methode of methode QueryStatusCommand implementeert, controleert u op de GUID van de opdrachtenset waartoe de opdracht behoort en de id van de opdracht. Volg deze richtlijnen:
Als de GUID niet wordt herkend, moet uw implementatie van een van beide methoden OLECMDERR_E_UNKNOWNGROUP retourneren.
Als uw implementatie van een van beide methoden de GUID herkent, maar de opdracht niet heeft geïmplementeerd, moet de methode worden geretourneerd OLECMDERR_E_NOTSUPPORTED.
Als uw implementatie van een van beide methoden zowel de GUID als de opdracht herkent, moet de methode het veld command-flags van elke opdracht (in de
prgCmdsparameter) instellen met behulp van de volgende OLECMDF vlaggen:OLECMDF_SUPPORTED: De opdracht wordt ondersteund.OLECMDF_INVISIBLE: De opdracht mag niet zichtbaar zijn.OLECMDF_LATCHED: Het commando is ingeschakeld en lijkt te zijn aangevinkt.OLECMDF_ENABLED: De opdracht is ingeschakeld.OLECMDF_DEFHIDEONCTXTMENU: De opdracht moet worden verborgen als deze wordt weergegeven in een snelmenu.OLECMDF_NINCHED: De opdracht is een menucontroller en is niet ingeschakeld, maar de vervolgkeuzelijst is niet leeg en is nog steeds beschikbaar. (Deze vlag wordt zelden gebruikt.)
Als de opdracht is gedefinieerd in het VSCT-bestand met de
TextChangesvlag, stelt u de volgende parameters in:Stel het
rgwzelement van depCmdTextparameter in op de nieuwe tekst van de opdracht.Stel het
cwActualelement van depCmdTextparameter in op de grootte van de opdrachtreeks.
Zorg er ook voor dat de huidige context geen automatiseringsfunctie is, tenzij uw opdracht specifiek is bedoeld om automatiseringsfuncties te verwerken.
Als u wilt aangeven dat u een bepaalde opdracht ondersteunt, retourneert u S_OK. Voor alle andere opdrachten retourneert u OLECMDERR_E_NOTSUPPORTED.
In het volgende voorbeeld zorgt de QueryStatus methode er eerst voor dat de context geen automatiseringsfunctie is en vervolgens de juiste guid en opdracht-id van de opdrachtset vindt. De opdracht zelf is ingesteld op ingeschakeld en ondersteund. Er worden geen andere commando's ondersteund.
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;
}
Uitvoeringsmethoden
De implementatie van de Exec methode lijkt op de implementatie van de QueryStatus methode. Zorg er eerst voor dat de context geen automatiseringsfunctie is. Test vervolgens op zowel de GUID als de opdracht-id. Als de GUID of opdracht-id niet wordt herkend, retourneer OLECMDERR_E_NOTSUPPORTED.
Als u de opdracht wilt afhandelen, voert u deze uit en retourneert u S_OK als de uitvoering slaagt. Uw opdracht is verantwoordelijk voor foutdetectie en -melding; retourneer daarom een foutcode als de uitvoering mislukt. In het volgende voorbeeld ziet u hoe de uitvoeringsmethode moet worden geïmplementeerd.
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;
}