Implementazione del comando
Per implementare un comando in un VSPackage, è necessario effettuare le attività seguenti:
Nel file di .vsct, impostare un gruppo di controlli e quindi aggiungere il comando. Per ulteriori informazioni, vedere Tabella dei comandi di Visual Studio (. file di Vsct)l'articolo
registrare il comando con Visual Studio.
implementare il comando.
Nelle sezioni seguenti viene illustrato come registrare e implementare i controlli.
Registrare i controlli con Visual Studio
Se il comando deve essere visualizzato in un menu, è necessario aggiungere ProvideMenuResourceAttribute al package VS e utilizzare come valore il nome del menu o l'id delle risorse
[ProvideMenuResource("Menus.ctmenu", 1)]
...
public sealed class MyPackage : Package
{.. ..}
Inoltre, è necessario registrare il comando con OleMenuCommandService. È possibile ottenere questo servizio tramite il metodo di GetService se il package VS è derivato da 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 );
}
Implementare i controlli
Esistono diversi modi per implementare i controlli. Se si desidera che un comando di menu statico, che è un comando che viene sempre la stessa modalità e sullo stesso menu, creare il comando utilizzando MenuCommand come illustrato negli esempi riportati nella sezione precedente. Per creare un comando statico, è necessario fornire un gestore eventi che è responsabile del comando. Poiché il comando è sempre abilitato e visibile, non è necessario fornire allo stato a Visual Studio. Se si desidera modificare lo stato di un comando in base a determinate condizioni, è possibile creare il comando come istanza della classe di OleMenuCommand e, nel costruttore, fornisce un gestore eventi per eseguire il comando e un gestore di query-stato informare Visual Studio quando cambia lo stato del comando. È anche possibile implementare IOleCommandTarget come parte di una classe di comando o, è possibile implementare IVsHierarchy se si assegna a un comando come parte di un progetto. Le due interfacce e OleMenuCommand classe dispongono tutte dei metodi che notificano a Visual Studio di una modifica nello stato di un comando e altri metodi che consentono l'esecuzione del comando.
Quando un comando viene aggiunto al servizio di comando, diventa uno di una catena dei controlli. Quando si implementano i metodi di notifica e di esecuzione dello stato per il comando, hello per fornire solo a quel determinato comando e passare tutti gli altri casi rispetto agli altri controlli nella catena. Se non si riesce a passare il comando su (in genere restituisce OLECMDERR_E_NOTSUPPORTED), Visual Studio può smettere di funzionare correttamente.
Metodi dello stato della query
Se si distribuisce il metodo di QueryStatus o il metodo di QueryStatusCommand , verificare il GUID del comando impostata sul comando appartiene e l'ID di comando. Attenersi alle seguenti indicazioni:
Se il GUID non viene riconosciuto, l'implementazione di qualsiasi metodo deve restituire OLECMDERR_E_UNKNOWNGROUP.
Se l'implementazione di qualsiasi metodo riconosce il GUID ma non ha effettivamente distribuito il comando, il metodo deve restituire OLECMDERR_E_NOTSUPPORTED.
Se l'implementazione di qualsiasi metodo riconosce sia il GUID del comando, il metodo deve impostare il campo di comando-flag di ogni comando (nel parametro di prgCmds ) utilizzando i seguenti flag:
OLECMDF_SUPPORTED se il comando è supportato.
OLECMDF_INVISIBLE se il comando è visibile.
OLECMDF_LATCHED se il comando viene passato sopra e può essere controllato.
OLECMDF_ENABLED se il comando è abilitato.
OLECMDF_DEFHIDEONCTXTMENU se il comando è nascosto se viene visualizzato un menu di scelta rapida.
OLECMDF_NINCHED se il comando è un controller di menu e non è attivato, ma il relativo elenco a discesa non è vuoto e viene ancora disponibili. (Questo flag viene utilizzato raramente.)
Se il comando è stato definito nel file di .vsct con il flag di TextChanges , impostare i seguenti parametri:
Impostare l'elemento di rgwz del parametro di pCmdText al nuovo testo del comando.
Impostare l'elemento di cwActual del parametro di pCmdText alle dimensioni della stringa di comando.
Assicurarsi inoltre che il contesto corrente non è una funzione di automazione, a meno che il comando in particolare è necessario gestire le macro né altre funzioni di automazione.
Per indicare che supporta un determinato comando, S_OKrestituita. Per tutti gli altri controlli, OLECMDERR_E_NOTSUPPORTEDrestituita.
Nell'esempio seguente, lo query-stato che prima il metodo assicura che il contesto non è una funzione di automazione, quindi che cerca il GUID e l'id comando-impostati corretti di comando Il comando stesso è impostato essere attivato e supportato. Non esistono altri controlli supportati.
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;
}
}
metodi di esecuzione
L'implementazione del metodo Execute è simile all'implementazione del metodo dello query-stato. Innanzitutto, assicurarsi che il contesto non è una funzione di automazione. Quindi test sia per il GUID e l'id di comando Se il GUID o l'ID di comando non viene riconosciuto, restituire OLECMDERR_E_NOTSUPPORTED.
Per gestire il comando, eseguirla e restituire S_OK se l'esecuzione ha esito positivo. Il comando è responsabile del rilevamento e della notifica degli errori; pertanto, restituire un codice di errore se l'esecuzione ha esito negativo. Nell'esempio seguente viene illustrato il metodo execute deve essere implementato.
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;
}
Vedere anche
Concetti
Come Vspackage aggiunge gli elementi dell'interfaccia utente dell'IDE