![]() |
||||
|
This article provides a code sample to add buttons, commandbars and toolbars to the Visual Studio .NET IDE from an add-in. More information Visual Studio .NET allows add-ins to add commandbars of two kinds, permanent or temporary:
Important notes
Sample code The following source code (VB.NET) shows an add-in that creates an EnvDTE.Command and exposes it in the Visual Studio .NET IDE through the following UI elements:
Both permanent and temporary approaches are shown. For temporary commandbars: Public Class Connect Implements Extensibility.IDTExtensibility2 Implements IDTCommandTarget Private Const MY_COMMAND_NAME As String = "MyCommand" Private applicationObject As EnvDTE.DTE Private addInInstance As EnvDTE.AddIn Private myStandardCommandBarControl As CommandBarControl Private myToolsCommandBarControl As CommandBarControl Private myCodeWindowCommandBarControl As CommandBarControl Private myTemporaryToolbar As CommandBar Private myTemporaryCommandBarPopup As CommandBarPopup Public Sub OnConnection(ByVal application As Object, ByVal connectMode _
As Extensibility.ext_ConnectMode, ByVal addInInst As Object, _
ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnConnection
Try applicationObject = CType(application, EnvDTE.DTE)
addInInstance = CType(addInInst, EnvDTE.AddIn)
Select Case connectMode Case ext_ConnectMode.ext_cm_Startup
' The add-in was marked to load on startup
' Do nothing at this point because the IDE may not be fully initialized
' VS will call OnStartupComplete when ready
Case ext_ConnectMode.ext_cm_AfterStartup
' The add-in was loaded after startup
' Initialize it in the same way that when is loaded on startup calling manually this method:
OnStartupComplete(Nothing)
End Select Catch e As System.Exception
System.Windows.Forms.MessageBox.Show(e.ToString)
End Try
End Sub Public Sub OnStartupComplete(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnStartupComplete
Dim myCommand As Command = Nothing
Dim standardCommandBar As CommandBar
Dim menuCommandBar As CommandBar
Dim toolsCommandBar As CommandBar
Dim codeCommandBar As CommandBar
Dim toolsCommandBarControl As CommandBarControl
Dim myCommandBarButton As CommandBarButton
Dim position As Integer
Dim commandBars As CommandBars
Try
' Try to retrieve the command, just in case it was already created
Try
myCommand = applicationObject.Commands.Item(addInInstance.ProgID & _
"." & MY_COMMAND_NAME)
Catch
End Try
' Add the command if it does not exist
If myCommand Is Nothing Then
myCommand = applicationObject.Commands.AddNamedCommand(addInInstance, _
MY_COMMAND_NAME, MY_COMMAND_NAME, "Executes the command for MyAddin", True, _
59, Nothing, vsCommandStatus.vsCommandStatusSupported Or _
vsCommandStatus.vsCommandStatusEnabled)
End If
' Retrieve the collection of commandbars
' - In VS.NET 2002/2003 (which uses the Office.dll reference)
' DTE.CommandBars returns directly a CommandBars type, so a cast
' to CommandBars is redundant
' - In VS 2005 (which uses the new Microsoft.VisualStudio.CommandBars.dll reference)
' DTE.CommandBars returns an Object type, so we do need a cast to CommandBars
commandBars = DirectCast(applicationObject.CommandBars, CommandBars)
' Retrieve some built-in command bars
standardCommandBar = commandBars.Item("Standard")
menuCommandBar = commandBars.Item("MenuBar")
toolsCommandBar = commandBars.Item("Tools")
codeCommandBar = commandBars.Item("Code Window")
' Create the buttons from the commands
' Note:
' - In VS.NET 2002/2003 (which uses the Office.dll reference)
' Command.AddControl returns directly a CommandBarControl type, so a cast
' to CommandBarControl is redundant
' - In VS 2005 (which uses the new Microsoft.VisualStudio.CommandBars.dll reference)
' Command.AddControl returns an Object type, so we do need a cast to CommandBarControl
' Add a button to the built-in "Standard" toolbar
myStandardCommandBarControl = DirectCast(myCommand.AddControl(standardCommandBar, _
standardCommandBar.Controls.Count + 1), CommandBarControl)
myStandardCommandBarControl.Caption = MY_COMMAND_NAME
' Change the button style, which must be done casting the control to a button
myCommandBarButton = DirectCast(myStandardCommandBarControl, CommandBarButton)
myCommandBarButton.Style = MsoButtonStyle.msoButtonIcon
' Add a button to the built-in "Tools" menu
myToolsCommandBarControl = DirectCast(myCommand.AddControl(toolsCommandBar, _
toolsCommandBar.Controls.Count + 1), CommandBarControl)
myToolsCommandBarControl.Caption = MY_COMMAND_NAME
' Add a button to the built-in "Code Window" context menu
myCodeWindowCommandBarControl = DirectCast(myCommand.AddControl(codeCommandBar, _
codeCommandBar.Controls.Count + 1), CommandBarControl)
myCodeWindowCommandBarControl.Caption = MY_COMMAND_NAME
' Add a new toolbar with a button on it
myTemporaryToolbar = commandBars.Add("MyTemporaryToolbar", _
MsoBarPosition.msoBarTop, System.Type.Missing, True)
' Change the button style, which must be done casting the control to a button
myCommandBarButton = DirectCast(myCommand.AddControl(myTemporaryToolbar), _
CommandBarButton)
myCommandBarButton.Style = MsoButtonStyle.msoButtonIcon
' Make visible the toolbar
myTemporaryToolbar.Visible = True
' Calculate the position of a new command bar popup by the "Tools" menu
toolsCommandBarControl = DirectCast(toolsCommandBar.Parent, CommandBarControl)
position = toolsCommandBarControl.Index + 1
' Add a new command bar popup with a button on it
myTemporaryCommandBarPopup = DirectCast(menuCommandBar.Controls.Add( _
MsoControlType.msoControlPopup, System.Type.Missing, System.Type.Missing, _
position, True), CommandBarPopup)
myTemporaryCommandBarPopup.CommandBar.Name = "MyTemporaryCommandBarPopup"
myTemporaryCommandBarPopup.Caption = "My menu"
myCommand.AddControl(myTemporaryCommandBarPopup.CommandBar)
myTemporaryCommandBarPopup.Visible = True
Catch e As System.Exception
System.Windows.Forms.MessageBox.Show(e.ToString)
End Try
End Sub Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, _
ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnDisconnection
Try If Not (myStandardCommandBarControl Is Nothing) Then
myStandardCommandBarControl.Delete()
End If
If Not (myCodeWindowCommandBarControl Is Nothing) Then
myCodeWindowCommandBarControl.Delete()
End If
If Not (myToolsCommandBarControl Is Nothing) Then
myToolsCommandBarControl.Delete()
End If
If Not (myTemporaryToolbar Is Nothing) Then
myTemporaryToolbar.Delete()
End If
If Not (myTemporaryCommandBarPopup Is Nothing) Then
myTemporaryCommandBarPopup.Delete()
End If
Catch e As System.Exception
System.Windows.Forms.MessageBox.Show(e.ToString)
End Try
End Sub Public Sub OnBeginShutdown(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub
Public Sub OnAddInsUpdate(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub Exec(ByVal cmdName 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 cmdName = addInInstance.ProgID & "." & MY_COMMAND_NAME Then handled = True
System.Windows.Forms.MessageBox.Show("Command executed.")
End If End If End Sub Public Sub QueryStatus(ByVal cmdName As String, _
ByVal neededText As vsCommandStatusTextWanted, _
ByRef statusOption As vsCommandStatus, ByRef commandText As Object) _
Implements IDTCommandTarget.QueryStatus
If neededText = vsCommandStatusTextWanted.vsCommandStatusTextWantedNone Then If cmdName = addInInstance.ProgID & "." & MY_COMMAND_NAME Then
statusOption = CType(vsCommandStatus.vsCommandStatusEnabled + _
vsCommandStatus.vsCommandStatusSupported, vsCommandStatus)
Else
statusOption = vsCommandStatus.vsCommandStatusUnsupported
End If
End If End Sub End Class For permanent commandbars: Public Class Connect
Implements Extensibility.IDTExtensibility2
Implements IDTCommandTarget
Private Const MY_COMMAND_NAME As String = "MyCommand" Private applicationObject As EnvDTE.DTE
Private addInInstance As EnvDTE.AddIn
Private myStandardCommandBarControl As CommandBarControl
Private myToolsCommandBarControl As CommandBarControl
Private myCodeWindowCommandBarControl As CommandBarControl
Private myPermanentToolbar As CommandBar
Private myPermanentCommandBarPopup As CommandBar
Private myPermanentCommandBarMenu As CommandBar
Public Sub OnConnection(ByVal application As Object, ByVal connectMode _
As Extensibility.ext_ConnectMode, ByVal addInInst As Object, _
ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnConnection
Const MY_PERMANENT_MENU As String = "My Permanent Menu"
Const MY_PERMANENT_SUBMENU As String = "My Permanent Submenu"
Const MY_PERMANENT_TOOLBAR As String = "My Permanent Toolbar"
Dim myCommand As Command = Nothing
Dim standardCommandBar As CommandBar
Dim menuCommandBar As CommandBar
Dim toolsCommandBar As CommandBar
Dim codeCommandBar As CommandBar
Dim toolsCommandBarControl As CommandBarControl
Dim myCommandBarButton As CommandBarButton
Dim position As Integer
Dim commandBars As CommandBars
Try applicationObject = CType(application, EnvDTE.DTE)
addInInstance = CType(addInInst, EnvDTE.AddIn)
Select Case connectMode Case ext_ConnectMode.ext_cm_UISetup myCommand = applicationObject.Commands.AddNamedCommand(addInInstance, _
MY_COMMAND_NAME, MY_COMMAND_NAME, "Executes the command for MyAddin", True, _
59, Nothing, vsCommandStatus.vsCommandStatusSupported Or _
vsCommandStatus.vsCommandStatusEnabled)
' Retrieve the collection of commandbars
' - In VS.NET 2002/2003 (which uses the Office.dll reference)
' DTE.CommandBars returns directly a CommandBars type, so a cast
' to CommandBars is redundant
' - In VS 2005 (which uses the new Microsoft.VisualStudio.CommandBars.dll reference)
' DTE.CommandBars returns an Object type, so we do need a cast to CommandBars
commandBars = DirectCast(applicationObject.CommandBars, CommandBars)
' Retrieve some built-in command bars
standardCommandBar = commandBars.Item("Standard")
menuCommandBar = commandBars.Item("MenuBar")
toolsCommandBar = commandBars.Item("Tools")
codeCommandBar = commandBars.Item("Code Window")
' Create the buttons from the commands
' Note:
' - In VS.NET 2002/2003 (which uses the Office.dll reference)
' Command.AddControl returns directly a CommandBarControl type, so a cast
' to CommandBarControl is redundant
' - In VS 2005 (which uses the new Microsoft.VisualStudio.CommandBars.dll reference)
' Command.AddControl returns an Object type, so we do need a cast to CommandBarControl
' Add a button to the built-in "Standard" toolbar
myStandardCommandBarControl = DirectCast(myCommand.AddControl(standardCommandBar, _
standardCommandBar.Controls.Count + 1), CommandBarControl)
myStandardCommandBarControl.Caption = MY_COMMAND_NAME ' Change the button style, which must be done casting the control to a button
myCommandBarButton = DirectCast(myStandardCommandBarControl, CommandBarButton)
myCommandBarButton.Style = MsoButtonStyle.msoButtonIcon
' Add a button to the built-in "Tools" menu
myToolsCommandBarControl = DirectCast(myCommand.AddControl(toolsCommandBar, _
toolsCommandBar.Controls.Count + 1), CommandBarControl)
myToolsCommandBarControl.Caption = MY_COMMAND_NAME
' Add a button to the built-in "Code Window" context menu
myCodeWindowCommandBarControl = DirectCast(myCommand.AddControl(codeCommandBar, _
codeCommandBar.Controls.Count + 1), CommandBarControl)
myCodeWindowCommandBarControl.Caption = MY_COMMAND_NAME
' Add a new toolbar with a button on it, trying to delete it if it exists from a
' previous execution, because the /resetaddin command-line switch of VS 2005 add-in
' projects only resets commands and buttons, not commandbars
Try
commandBars.Item(MY_PERMANENT_TOOLBAR).Delete()
Catch ex As Exception
End Try
myPermanentToolbar = DirectCast(applicationObject.Commands.AddCommandBar( _
MY_PERMANENT_TOOLBAR, vsCommandBarType.vsCommandBarTypeToolbar, Nothing, 1), _
CommandBar)
myPermanentToolbar.Position = MsoBarPosition.msoBarTop
myPermanentToolbar.RowIndex = 10 ' Hopefully the last one
' Make the toolbar visible
myPermanentToolbar.Visible = True
' Change the button style, which must be done casting the control to a button
myCommandBarButton = DirectCast(myCommand.AddControl(myPermanentToolbar), _
CommandBarButton)
myCommandBarButton.Style = MsoButtonStyle.msoButtonIcon
' Calculate the position of a new command bar popup by the "Tools" menu
toolsCommandBarControl = DirectCast(toolsCommandBar.Parent, CommandBarControl)
position = toolsCommandBarControl.Index + 1
' Add a new command bar menu in the main menu with a button on it
Try
commandBars.Item(MY_PERMANENT_MENU).Delete()
menuCommandBar.Controls.Item(MY_PERMANENT_MENU).Delete()
Catch ex As Exception
End Try
myPermanentCommandBarMenu = DirectCast(applicationObject.Commands.AddCommandBar( _
MY_PERMANENT_MENU, vsCommandBarType.vsCommandBarTypeMenu, menuCommandBar, position), _
CommandBar)
myCommand.AddControl(myPermanentCommandBarMenu)
' Add a new command bar submenu under the "Tools" menu with a button on it
Try
commandBars.Item(MY_PERMANENT_SUBMENU).Delete()
toolsCommandBar.Controls.Item(MY_PERMANENT_SUBMENU).Delete()
Catch ex As Exception
End Try
myPermanentCommandBarPopup = DirectCast(applicationObject.Commands.AddCommandBar( _
MY_PERMANENT_SUBMENU, vsCommandBarType.vsCommandBarTypeMenu, _
toolsCommandBar, 1), CommandBar)
myCommand.AddControl(myPermanentCommandBarPopup) End Select Catch e As System.Exception
System.Windows.Forms.MessageBox.Show(e.ToString)
End Try
End Sub Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, _
ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnDisconnection
End Sub Public Sub OnStartupComplete(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnStartupComplete
End Sub Public Sub OnBeginShutdown(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub Public Sub OnAddInsUpdate(ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub Public Sub Exec(ByVal cmdName 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 cmdName = addInInstance.ProgID & "." & MY_COMMAND_NAME Then
handled = True
System.Windows.Forms.MessageBox.Show("Command executed.")
End If
End If
End Sub Public Sub QueryStatus(ByVal cmdName As String, _
ByVal neededText As vsCommandStatusTextWanted, _
ByRef statusOption As vsCommandStatus, ByRef commandText As Object) _
Implements IDTCommandTarget.QueryStatus
If neededText = vsCommandStatusTextWanted.vsCommandStatusTextWantedNone Then If cmdName = addInInstance.ProgID & "." & MY_COMMAND_NAME Then
statusOption = CType(vsCommandStatus.vsCommandStatusEnabled + _
vsCommandStatus.vsCommandStatusSupported, vsCommandStatus)
Else
statusOption = vsCommandStatus.vsCommandStatusUnsupported
End If
End If End Sub End Class You may have noticed that when calling Commands.AddCommandBar the code uses the value vsCommandBarType.vsCommandBarTypeToolbar for toolbars and the value vsCommandBarType.vsCommandBarTypeMenu for both menu entries in the main menu or in a commandbar such as the "Tools" menu. There is a third value vsCommandBarType.vsCommandBarTypePopup that it is not used in the code. This value is used to create a commandbar popup that appears only when you right-click somewhere (like a context menu). To do this, you would call the ShowPopup(x,y) method of the returned CommandBar. Related articles
Go back to the 'Resources for Visual Studio .NET extensibility' section for more articles like this
You can code, design, locate code and document your apps much faster using VB.NET, C#, C++ or Visual J#:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||