命令的實作
若要實作 VSPackage 命令,您必須執行下列工作:
在.vsct 檔案中,設定命令群組,然後新增命令給它。 如需詳細資訊,請參閱Visual Studio 命令表裡 (。Vsct) 檔案'
登錄 Visual Studio 的命令。
實作該命令。
下文將說明如何註冊和實作命令。
使用 Visual Studio 註冊命令
如果您的指令是出現在功能表上,您必須將ProvideMenuResourceAttribute VSPackage,來做為功能表的名稱,或者是其資源識別碼。
[ProvideMenuResource("Menus.ctmenu", 1)]
...
public sealed class MyPackage : Package
{.. ..}
此外,您必須註冊命令及OleMenuCommandService。 您可以使用,以取得這項服務GetService方法,如果您的 VSPackage 衍生自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 );
}
實作命令
有許多方法來實作命令。 如果您要在靜態功能表的指令,也就是永遠都出現相同方式,並在同一功能表上的命令,建立的命令,藉由使用MenuCommand前一節中的範例所示。 若要建立一個靜態的指令,您必須提供事件處理常式負責執行命令。 因為命令都是看得見且已啟用,並沒有提供其狀態為 Visual Studio。 如果您想要變更的命令,以根據特定條件的狀態,您可以建立命令的執行個體為OleMenuCommand類別,並在其建構函式,會提供事件處理常式來執行命令和命令的狀態變更時通知 Visual Studio 的查詢狀態處理常式。 您也可以實作IOleCommandTarget一命令類別或部分,您可以實作IVsHierarchy如果您提供的指令為專案的一部分。 這兩個介面和OleMenuCommand所有的類別有方法告知的狀態的命令,變更的 Visual Studio,並提供命令的執行其他方法。
當命令加入至命令服務時,它會變成其中一項一連串的指令。 當您實作該命令的狀態通知和執行方法時,謹慎只提供該特定指令,並傳遞至其他命令的其他所有情況下鏈結中。 如果您無法將命令傳遞 (通常是藉由傳回OLECMDERR_E_NOTSUPPORTED),Visual Studio 可能會停止運作正常。
查詢狀態的方法
如果您正在實作其中一個QueryStatus方法或QueryStatusCommand方法、 核取 [設定] 指令的 guid 來進行命令] 及 [指令的識別碼。 請遵循這些方針:
如果無法辨識的 GUID,不論是哪一種方法的實作必須傳回OLECMDERR_E_UNKNOWNGROUP。
如果您的任何一種方法的實作可以識別的 GUID,但實際上尚未命令,則方法會傳回OLECMDERR_E_NOTSUPPORTED。
如果您的任何一種方法的實作可以辨識的 GUID,並命令,那麼方法必須設定的每個命令的命令旗標] 欄位 (在prgCmds參數) 藉由下列旗標:
OLECMDF_SUPPORTED如果支援該命令。
OLECMDF_INVISIBLE如果命令不應該為可見的。
OLECMDF_LATCHED如果命令上切換,而且看起來似乎已核取。
OLECMDF_ENABLED如果已啟用] 指令。
OLECMDF_DEFHIDEONCTXTMENU如果顯示快顯功能表上,是否應隱藏] 指令。
OLECMDF_NINCHED如果命令的功能表控制站,且未啟用,但它的下拉功能表清單並非空白且仍可使用。 (這個旗標很少使用)。
如果指令定義在.vsct 檔案,與TextChanges加上旗標,請將下列參數:
設定rgwz中的項目pCmdText參數,以新命令的文字。
設定cwActual中的項目pCmdText參數的指令字串的大小。
也請確定目前的內容不是自動化函式,除非您的指令特別用於處理巨集或其他的自動化功能。
若要指定您是否支援特定的指令,請傳回S_OK。 所有其他的命令會傳回OLECMDERR_E_NOTSUPPORTED。
在下列範例中,查詢狀態方法首先會確定內容不是自動化函式,然後找出正確的命令集 GUID 和命令 id。 在命令本身會設為啟用,而且支援。 不支援任何其他命令。
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;
}
}
執行方法
Execute 方法實作類似的查詢狀態方法的實作。 首先,確定內容不是自動化函數。 然後測試 GUID,並命令 id。 如果 GUID 或無法辨認的命令 ID 時,傳回OLECMDERR_E_NOTSUPPORTED。
若要處理的命令,執行它,並傳回S_OK如果執行成功。 您的命令負責進行錯誤偵測及通知 ; 如果執行作業失敗,因此,傳回錯誤碼。 下列範例會示範實作執行方法的方式。
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;
}