HOW TO:在增益集按鈕上顯示自訂圖示
更新:2007 年 11 月
您能夠以不是預先定義之標準圖示的圖示來取代顯示在增益集命令旁的預設圖示 (一個笑臉),如 HOW TO:變更增益集的預設圖示中所述。
執行此動作需要:
將圖示點陣圖放置在附屬 DLL 檔中做為資源。
將 AddNamedCommand2 方法中的 MSOButton 參數設定為 false (這會告知該方法在附屬 DLL 中尋找圖示點陣圖)。
在您增益集專案的命令列部分,參考該資源的識別碼。
下列程序示範如何將自訂圖示加入至增益集按鈕。
注意事項: |
---|
根據目前使用的設定與版本,您所看到的對話方塊與功能表命令可能會與 [說明] 中所描述的不同。這些程序是使用 [一般開發設定] 開發的。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
若要將自訂點陣圖當做增益集按鈕圖示加入至增益集專案
開啟現有的增益集方案,或在 Visual Studio 中建立新的增益集方案。
如果您建立新的增益集,請確定核取「您要建立增益集的命令列 UI 嗎?」選項。
將新的資源檔加入至增益集專案。如要完成這項工作:
以滑鼠右鍵按一下 [方案總管] 中的增益集專案。
從 [加入] 功能表上選取 [新增項目]。
在 [範本] 清單中選取 [資源檔],然後按一下 [加入] 按鈕。保留它的預設名稱 (Resources1.resx)。
這會啟動 Visual Studio [資源編輯器]。
按一下 [方案總管] 工具列上的 [顯示所有檔案] 按鈕。
在 Resource1.resx 的屬性中,將 [建置動作] 屬性設定為「無」。
增益集需要整數值做為點陣圖引數。設定這個屬性可讓您編輯資源檔,並以數字識別項為點陣圖資源命名,這是當 .resx 檔屬於增益集專案的一部分時,您所無法做到的動作。
在 [資源編輯器] 中按一下 [加入資源],然後選取 [新增影像] 功能表上的 [BMP 影像]。現在先保留它的預設名稱 (Image1.bmp)。
另外,您可以選取 16 x 16 像素且為 16 色或全彩的現有點陣圖影像。增益集的自訂圖示必須是 16 x 16 像素,且為 16 色或全彩。
在點陣圖屬性視窗中,將 [高度] 和 [寬度] 屬性都變更為 16。將 [色彩] 屬性設定為且為 16 色或全彩。
如果您建立新的點陣圖,請在 [資源編輯器] 中編輯圖片。
以滑鼠右鍵按一下 [方案總管] 中的 Resource1.resx 檔,然後選取 [從專案移除]。
如此做可避免不必要的編譯器錯誤。檔案不需要位在專案中。這能讓您使用內建的 [資源編輯器]。
開啟增益集的 Connect 類別。在 AddNamedCommand2 程式碼行的 OnConnection 方法中,將 MSOButton 參數值從 true 變更為 false,並將 Bitmap 參數值從 59 變更為 1。例如:
command = commands.AddNamedCommand2(_addInInstance, "MyAddin1", " MyAddin1", "Executes the command for MyAddin1", False, 1, Nothing, CType(vsCommandStatus.vsCommandStatusSupported, Integer) + CType(vsCommandStatus.vsCommandStatusEnabled, Integer), vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton)
Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin1", "MyAddin1", "Executes the command for MyAddin1", false, 1, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus. vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
將 MSOButton 引數設定為 false 會強制增益集搜尋資源檔中的按鈕點陣圖。數字 1 將是該點陣圖的識別項 (它會在稍後的步驟中設定)。
當您完成以後,選取 [檔案] 功能表上的 [全部儲存],然後選取 [建置] 功能表上的 [建置方案],接著再關閉方案。
在 [Windows 檔案總管] 中使用 [記事本] 編輯 Resource1.resx 檔。
搜尋 "Image1" 的所有執行個體,並將它們變更為 "1."。當您完成時,請儲存檔案。
在增益集的 [\Resources] 資料夾中,將點陣圖檔名從 Image1.bmp 變更為 1.bmp。
使用 ResGen 和組件連結器 (AL) 建置附屬 DLL。如要完成這項工作:
在 [開始] 功能表上,指向 [所有程式]、接著依序指向 [Microsoft Visual Studio 2005]、[Visual Studio 工具],然後按一下 [Visual Studio 命令提示字元]。
這會設定某些環境變數,讓您可以更容易參考 Visual Studio 工具。
在命令提示字元中,移至包含 .resx 檔的資料夾,並輸入 Resgen Resource1.resx。
Resgen 是將指定的 .resx 檔編譯為 .resources 檔的公用程式。如需詳細資訊,請參閱 資源檔產生器 (Resgen.exe)。
在命令提示字元中再次輸入下列文字:Al.exe /embed:Resource1.resources /culture:en-US /out:<Add-In Name>.resources.dll。
使用您的增益集名稱取代 <Add-In Name>。例如,如果您的增益集專案名為 MyAddin1,則 /out: 參數將會是 /out:MyAddin1.resources.dll。如果 /out: 名稱與專案名稱不相符,則會找不到資源 DLL。
組件連結器 (Al.exe) 會將指定的 .resources 檔轉換成您可在增益集中參考的附屬資源 DLL (您可以將 /culture 參數變更為英文以外的其他語言)。如需詳細資訊,請參閱組件連結器 (Al.exe)。
使用 [Windows 檔案總管],瀏覽至增益集的 DLL 目錄 (通常是 [\bin] 資料夾),並建立名為 en-US (這是適用於美式英文,因為您在 Al 中輸入 [en-US] 做為文化特性值) 的資料夾。
將 <Add-In Name>.resources.dll 檔複製至新的 en-US 資料夾。
在 Visual Studio 中再次開啟增益集專案,並執行它。
按一下 [工具] 功能表。
增益集會和自訂圖示一起出現在 [工具] 功能表上。
若要將自訂點陣圖當成增益集按鈕圖示加入至原生 Visual C++ 增益集
請遵循上述的相同程序,但要變更下列項目。
建立新的 Visual C++ Win32 DLL 專案。
加入資源檔 (.rc)。
在 [資源檢視] 中,加入點陣圖 (16 x 16) 並為它提供一個數字 ID。
點陣圖必須為 16 x 16 像素且為 16 色或全彩。
修改 Connect.cpp 中的 AddNamedCommand2 方法,將 MSOButton 設定為 VARIANT_FALSE,並將 Bitmap 設定為您先前指定的點陣圖 ID。
建置 DLL。
在原生增益集 DLL 目錄中建立子資料夾 "1033" (英文地區設定)。
將附屬 DLL 複製至 "1033" 目錄。
開啟 AddIn.rgs 並加入兩個登錄機碼值 "SatelliteDllName" 和 "SatelliteDllPath"。例如:
HKCU { NoRemove 'SOFTWARE' { NoRemove 'Microsoft' { NoRemove 'VisualStudio' { NoRemove '8.0' { NoRemove 'AddIns' { ForceRemove 'NativeAddinCustBitmap.Connect' { val LoadBehavior = d 0 val CommandLineSafe = d 0 val CommandPreload = d 1 val FriendlyName = s 'NativeAddinCustBitmap' val Description = s 'NativeAddinCustBitmap Description' val SatelliteDllName = s 'NativeAddinCustBitmapUI.dll' val SatelliteDllPath = s 'C:\Test\CustomBitmap\NativeAddinCustBitmap \NativeAddinCustBitmap\Debug' } } } } } } }
在 "SatelliteDllPath" 中,不要在路徑中加入地區設定 ID。它將會在執行階段中自動附加。
重新建置增益集以註冊更新的資訊。
範例
下列是 Visual Basic/Visual C#/Visual J# 增益集 (會參考包含在附屬資源 DLL 中的自訂圖示) 的完整增益集程式碼範例。
Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Public Class Connect
Implements IDTExtensibility2
Implements IDTCommandTarget
Dim _applicationObject As DTE2
Dim _addInInstance As AddIn
Public Sub New()
End Sub
Public Sub OnConnection(ByVal application As Object, _
ByVal connectMode As ext_ConnectMode, ByVal addInInst _
As Object, ByRef custom As Array) Implements _
IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
If connectMode = ext_ConnectMode.ext_cm_UISetup Then
Dim commands As Commands2 = CType(_applicationObject. _
Commands, Commands2)
Dim toolsMenuName As String
Try
' To move the command to a different
' menu, change the word, Tools, to the English version
' of the menu. This code will take the culture, append
' the name of the menu, and then add the command to
' that menu. A list of all the top-level menus is
' in the file, CommandBar.resx.
Dim resourceManager As System.Resources. _
ResourceManager = New System.Resources. _
ResourceManager("MyAddin3.CommandBar", _
System.Reflection.Assembly.GetExecutingAssembly())
Dim cultureInfo As System.Globalization.CultureInfo _
= New System.Globalization. _
CultureInfo(_applicationObject.LocaleID)
toolsMenuName = resourceManager.GetString(String. _
Concat (cultureInfo.TwoLetterISOLanguageName, _
"Tools"))
Catch e As Exception
' We tried to find a localized version of the word,
' Tools, but one was not found. Default to the en-US
' word, which may work for the current culture.
toolsMenuName = "Tools"
End Try
' Place the command on the Tools menu.
' Find the MenuBar command bar, which is the top-level
' command bar holding all the main menu items:
Dim commandBars As CommandBars = _
CType(_applicationObject.CommandBars, _
CommandBars)
Dim menuBarCommandBar As CommandBar = _
commandBars.Item("MenuBar")
' Find the Tools command bar on the MenuBar command bar.
Dim toolsControl As CommandBarControl = _
menuBarCommandBar.Controls.Item(toolsMenuName)
Dim toolsPopup As CommandBarPopup = CType(toolsControl, _
CommandBarPopup)
Try
' Add a command to the Commands collection.
Dim command As Command = _
commands.AddNamedCommand2(_addInInstance, _
"MyAddin3", "MyAddin3", "Executes the command for _
MyAddin3", False, 1, Nothing, _
CType(vsCommandStatus.vsCommandStatusSupported, _
Integer) + CType(vsCommandStatus. _
vsCommandStatusEnabled, Integer), _
vsCommandStyle.vsCommandStylePictAndText, _
vsCommandControlType.vsCommandControlTypeButton)
' Find the appropriate command bar on the MenuBar
' command bar.
command.AddControl(toolsPopup.CommandBar, 1)
Catch argumentException As System.ArgumentException
' If we are here, then the exception is probably
' because a command with that name already exists. If
' so there is no need to recreate
' the command and we can safely ignore the exception.
End Try
End If
End Sub
Public Sub OnDisconnection(ByVal disconnectMode As _
ext_DisconnectMode, ByRef custom As Array) Implements _
IDTExtensibility2.OnDisconnection
End Sub
Public Sub OnAddInsUpdate(ByRef custom As Array) Implements _
IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub OnStartupComplete(ByRef custom As Array) Implements _
IDTExtensibility2.OnStartupComplete
End Sub
Public Sub OnBeginShutdown(ByRef custom As Array) Implements _
IDTExtensibility2.OnBeginShutdown
End Sub
Public Sub QueryStatus(ByVal commandName As String, ByVal _
neededText As vsCommandStatusTextWanted, ByRef status As _
vsCommandStatus, ByRef commandText As Object) Implements _
IDTCommandTarget.QueryStatus
If neededText = vsCommandStatusTextWanted. _
vsCommandStatusTextWantedNone Then
If commandName = "MyAddin3.Connect.MyAddin3" Then
status = CType(vsCommandStatus.vsCommandStatusEnabled _
+ vsCommandStatus.vsCommandStatusSupported, _
vsCommandStatus)
Else
status = vsCommandStatus.vsCommandStatusUnsupported
End If
End If
End Sub
Public Sub Exec(ByVal commandName As String, ByVal executeOption _
As vsCommandExecOption, ByRef varIn As Object, ByRef varOut As _
Object, ByRef handled As Boolean) Implements _
IDTCommandTarget.Exec
handled = False
If executeOption = vsCommandExecOption. _
vsCommandExecOptionDoDefault Then
If commandName = "MyAddin3.Connect.MyAddin3" Then
handled = True
MsgBox("Add-in is running.")
Exit Sub
End If
End If
End Sub
End Class
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Resources;
using System.Reflection;
using System.Globalization;
namespace MyAddin1
{
public class Connect : Object, IDTExtensibility2, IDTCommandTarget
{
public Connect()
{
}
public void OnConnection(object application, ext_ConnectMode
connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object []contextGUIDS = new object[] { };
Commands2 commands =
(Commands2)_applicationObject.Commands;
string toolsMenuName;
try
{
ResourceManager resourceManager = new
ResourceManager("MyAddin1.CommandBar",
Assembly.GetExecutingAssembly());
CultureInfo cultureInfo = new
System.Globalization.CultureInfo
(_applicationObject.LocaleID);
string resourceName = String.Concat(cultureInfo.
TwoLetterISOLanguageName, "Tools");
toolsMenuName =
resourceManager.GetString(resourceName);
}
catch
{
toolsMenuName = "Tools";
}
CommandBar menuBarCommandBar =
((CommandBars)_applicationObject.CommandBars)["MenuBar"];
CommandBarControl toolsControl =
menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
try
{
Command command =
commands.AddNamedCommand2(_addInInstance, "MyAddin1",
"MyAddin1", "Executes the command for MyAddin1",
false, 1, ref contextGUIDS,
(int)vsCommandStatus.vsCommandStatusSupported+(int)
vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText,
vsCommandControlType.vsCommandControlTypeButton);
if((command != null) && (toolsPopup != null))
{
command.AddControl(toolsPopup.CommandBar, 1);
}
}
catch
{
}
}
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref
Array custom)
{
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
public void QueryStatus(string commandName,
vsCommandStatusTextWanted neededText, ref vsCommandStatus status,
ref object commandText)
{
if(neededText ==
vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
{
if(commandName == "MyAddin1.Connect.MyAddin1")
{
status =
(vsCommandStatus)vsCommandStatus.
vsCommandStatusSupported|vsCommandStatus.
vsCommandStatusEnabled;
return;
}
}
}
public void Exec(string commandName, vsCommandExecOption
executeOption, ref object varIn, ref object varOut, ref bool
handled)
{
handled = false;
if(executeOption ==
vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if(commandName == "MyAddin1.Connect.MyAddin1")
{
handled = true;
System.Windows.Forms.MessageBox.Show("Add-in ran.");
return;
}
}
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
}
}