Steuerelemente der Visual Studio .NET-Toolbox hinzufügen

Veröffentlicht: 10. Jan 2005

Von Mathias Schiffer

In diesem MSDN Quickie erfahren Sie, wie Sie selbst erstellte Steuerelemente programmatisch der Visual Studio .NET Toolbox hinzufügen - ein Muss für Ihr Setup.

Das Erzeugen eines benutzerdefinierten Steuerelements kann eine anstrengende Angelegenheit sei. Denn neben dem Erstellen einer Dokumentation benötigen Sie noch ein Installationsprogramm, wenn Sie Ihr Werk auch Dritten zur Arbeitserleichterung zukommen lassen wollen.

In diesem Rahmen ist es beispielsweise auch empfehlenswert, dass Ihr Steuerelement mit der Installation auch einen Platz in der Visual Studio .NET-Steuerelementleiste findet. „Von Hand“ kann der Anwender dafür das Fenster „Toolbox anpassen“ verwenden, das er über den Extras-Menübefehl „Toolboxelemente hinzufügen/entfernen“ erreicht. Besser und professioneller wirkt es aber natürlich, wenn sich Ihr Installationsprogramm darum auch gleich kümmert.

Möchten Sie Abläufe in Visual Studio .NET programmieren, so benötigen Sie dafür Zugriff auf das Objektmodell der Entwicklungsumgebung, angeboten durch das DTE-Objekt im Namespace EnvDTE (.NET-Assembly envdte.dll, COM-Typbibliothek dte.olb). Es bildet den obersten Knoten der Automationsschnittstelle von Visual Studio .NET und ist mit dem Application-Objekt anderer VBA-/VSA-Hostanwendungen (z.B. Microsoft Office) vergleichbar. Die kryptische Abkürzung steht übrigens für „Development Tools Environment“.

Um das DTE-Objekt und damit das Automatisierungsmodell von Visual Studio .NET nutzen zu können, müssen Sie den Namespace EnvDTE in Ihrem Projekt referenzieren. Wählen Sie dazu aus der Liste der verfügbaren .NET-Referenzen den Eintrag „envdte“ aus. Nun können Sie ein DTE-Objekt erzeugen oder von einer laufenden Instanz von Visual Studio .NET abholen. Ausgeschlossen hingegen ist die Erzeugung eines DTE-Objekts über den Visual Basic-Operator New.

' Neue Instanz von Visual Studio .NET erzeugen
Dim DTE As Object
DTE = Microsoft.VisualBasic.Interaction.CreateObject ("VisualStudio.DTE.7.1")
  
' Bestehende Instanz der Visual Studio .NET IDE abholen
Dim DTE as EnvDTE.DTE
DTE = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"), EnvDTE.DTE)

Ist das DTE-Objekt erst einmal bei der Hand, gestaltet sich der Rest unseres Ansinnens beinahe wie ein Kinderspiel: Zunächst können Sie über die Windows-Auflistung das Fenster der Werkzeugleiste abholen. Bekanntlich besteht das Fenster der Werkzeugleiste aus mehreren Steuerelementgruppen, die im Werkzeugfenster als ToolBoxTab bezeichnet werden. Im Objektmodell der Entwicklungsumgebung sind diese in einer ToolBoxTabs-Auflistung gesammelt, die Sie nach Belieben modifizieren können. Jedes ToolBoxTab enthält die ToolBoxItems, wobei jedes ToolBoxItem einen Eintrag in einer Steuerelementgruppe repräsentiert – etwa das Icon eines Steuerelements, ein Textfragment (siehe MSDN Quickie „Toolbox in VS.NET für Codeschnipsel nutzen“) etc.

    ' Abholen des Automationsobjekts für VS .NET
    Dim DTE As EnvDTE.DTE
    DTE = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"), EnvDTE.DTE)
  
    ' Abholen des zugehörigen Werkzeugfensters
    Dim ToolboxWindow As EnvDTE.Window
    ToolboxWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindToolbox)
  
    ' Das Werkzeugfenster hat verschiedene Tabs, die in der
    ' abzuholenden ToolBoxTabs-Auflistung geführt werden:
    Dim ToolTabs As EnvDTE.ToolBoxTabs
    ToolTabs = CType(ToolboxWindow.Object, EnvDTE.ToolBox).ToolBoxTabs
  
    '' Probeausgabe für Ihre Tests: Titel aller Tabs ausgeben
    'For Each tt As EnvDTE.ToolBoxTab In ToolTabs
    '  Console.WriteLine(tt.Name)
    'Next
  
    ' So fügen Sie der Standard-Toolboxgruppe einen Texteintrag
    ' hinzu, der bei Verwendung ein Textfragment einfügt
    ' (Textbutton "Maustext", fügt "Hier kommt die Maus!" ein):
  
    Dim ToolTabItem As EnvDTE.ToolBoxItem
    ToolTabItem = ToolTabs.Item("General").ToolBoxItems().Add( _
                       "Maustext", _
                       "Hier kommt die Maus!", _
                       EnvDTE.vsToolBoxItemFormat.vsToolBoxItemFormatText)
  
  
    ' Erzeugen einer neuen Steuerelementgruppe im Werkzeugfenster
    ' und Einbringen von Steuerelement-Icons:
    ' ------------------------------------------------------------
  
    Dim ToolTab As EnvDTE.ToolBoxTab
  
    ' Neues Tab einrichten
    ToolTab = ToolTabs.Item("aixsoft-Controls")
    If ToolTab Is Nothing Then
      ToolTab = ToolTabs.Add("aixsoft-Controls")
    End If
  
    With ToolTab
  
      ' Steuerelement-Icons einer .NET-Komponente hinzufügen:
      .ToolBoxItems.Add("Supercontrol", _
                        "d:\aixcomponent.dll", _
                        EnvDTE.vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent)
  
      ' Textbutton "Maustext" hinzufügen (fügt "Hier kommt die Maus!" ein):
      .ToolBoxItems().Add( _
                         "Maustext", _
                         "Hier kommt die Maus!", _
                         EnvDTE.vsToolBoxItemFormat.vsToolBoxItemFormatText)
  
    End With

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.