Wenn wir Outlook um eigene Funktionen erweitern wollen, stellt sich eine Frage: Wie wollen wir diese auslösen? Es gibt einige Ereignisse, die wir bereits im Artikel Outlook: Explorer automatisieren (www.vbentwickler.de/307) erläutert haben. Diese werden beispielsweise durch Benutzeraktionen wie das Verschieben einer E-Mail in einen anderen Ordner ausgelöst. Aber wie können wir eigene Funktionen über die Benutzeroberfläche starten? Dazu bietet sich das Ribbon an. Hier können wir eigene Bereiche definieren, in denen wir unsere Funktionsaufrufe unterbringen. Der vorliegende Artikel erläutert, wie wir das Ribbon unter Outlook anpassen. Dabei sind einige Dinge zu berücksichtigen – zum Beispiel, dass es nicht wie bei den übrigen Office-Anwendungen nur ein Fenster gibt, das eine eigene Ribbondefinition verwendet.
Ribbon-Elemente im Überblick
Wir beginnen direkt mit dem eingangs erwähnten Umstand, dass Outlook nicht nur eine Ribbondefinition verwendet wie die übrigen Office-Anwendungen.
Das wird offensichtlich, wenn wir beispielsweise den Ribbonbefehl Start|Neu|Neue E-Mail aufrufen. Nicht nur das Outlook-Hauptfenster, sondern auch das Fenster zum Erstellen einer neuen E-Mail weist ein Ribbon auf (siehe Bild 1). Das macht die Sache im Gegensatz zu den übrigen Office-Anwendungen komplizierter. Woher wissen wir, für welches Fenster wir gerade das Ribbon anpassen? Und wie passen wir es in Outlook überhaupt an?
Bild 1: Outlook hat verschiedene Fenster mit Ribbons
Ribbon per Benutzeroberfläche anpassen
Genau wie die übrigen Office-Anwendungen bietet auch Outlook die Möglichkeit, das Ribbon über die Benutzeroberfläche anzupassen. Dazu öffnen wir die Outlook-Optionen und wechseln zum Bereich Menüband anpassen (siehe Bild 2). Hier finden wir in der rechten Liste einige Einträge mit den Hauptregisterkarten. Je nachdem, welcher Objekttyp gerade im Explorer angezeigt wird, also beispielsweise E-Mail oder Termin, erscheint ein anderes Start-Tab. Diese werden auch in der Liste der Hauptregisterkarten dargestellt – zum Beispiel Start (E-Mail) oder Start (Kalender).
Bild 2: Anpassen des Ribbons im Optionen-Dialog von Outlook
Ribbondefinition anpassen
Welche Möglichkeiten haben wir, das Ribbon von Outlook und seiner Explorer wie beispielsweise zum Erstellen von E-Mails anzupassen, wenn wir nicht die Benutzeroberfläche nutzen wollen?
Die einzige Möglichkeit ist die Programmierung eines COM-Add-Ins. Zum Glück kennen wir mit twinBASIC ein praktisches Tool, um COM-Add-Ins zu programmieren. Im Artikel COM-Add-Ins mit twinBASIC (www.vbentwickler.de/311) haben wir uns bereits die Grundlagen der Erstellung von COM-Add-Ins mit twinBASIC angesehen. Darauf bauen wir auf und erstellen mit twinBASIC ein neues COM-Add-In auf Basis der Vorlage Samples|MyCOMAddin. Dieses passen wir wie nachfolgend beschrieben an, um einen ersten eigenen Ribbon-Eintrag in Outlook zu erzeugen.
Projekteinstellungen anpassen
Nach dem Erstellen des Projekts ändern wir die Projekteinstellungen und fügen einen Verweis auf die Outlook-Bibliothek hinzu. Dazu klicken wir im Project Explorer auf den Eintrag Settings. Hier tragen wir für Project: Name, Project: Description und Project: Application Title jeweils den Wert OutlookRibbonAnpassen ein (siehe Bild 3).
Bild 3: Anpassen der Projekteinstellungen
Danach fügen wir im gleichen Bereich weiter unten unter COM Type Library / ActiveX References den Verweis Microsoft Outlook 16.0 Object Library hinzu.
Danach passen wir die Klasse MyCOMAddin an, indem wir diese in OutlookRibbonAnpassen umbenennen. Entsprechend ändern wir auch den Namen der Klasse im Code. Der allgemeine Teil des Codes der Klasse sieht nun wie folgt aus. Hier sehen wir die ClassId, mit der das COM-Add-In in der Registry einigetragen wird. Darunter folgt die eigentliche Definition der Klasse, die zwei Schnittstellen implementiert. IDTExtensibility2 enthält die Elemente, die für das Laden des COM-Add-Ins notwendig sind. IRibbonExtensibility liefert die Elemente, die für das Anwenden von Anpassungen der Ribbondefinition nötig sind. Außerdem definieren wir hier eine Objektvariable namens objOutlook mit dem Typ Outlook.Application. Diese füllen wir gleich im Anschluss mit einem Verweis auf die Outlook-Instanz, welche das COM-Add-In lädt:
[ ClassId ("2933A563-3C51-4120-AC8A-BA10CC656CA7") ] Class OutlookRibbonAnpassen Implements IDTExtensibility2 [ WithDispatchForwarding ] Implements IRibbonExtensibility Private objOutlook As Outlook.Application ... End Class
Für die Schnittstelle IDTExtensitility2 müssen wir die folgenden fünf Ereignisprozeduren implementieren, von denen wir nur die erste mit einer Anweisung füllen. Das Ereignis OnConnection wird beim Verbinden der Anwendung mit dem COM-Add-In ausgelöst und liefert unter anderem mit dem Parameter Application einen Verweis auf die aufrufende Anwendung, in diesem Fall Outlook. Den Inhalt dieses Parameters weisen wir der Variablen objOutlook zu. Diese und die übrigen Ereignisprozeduren sehen wir in Listing 1.
Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, ByVal AddInInst As Object, _ ByRef custom As Variant()) Implements IDTExtensibility2.OnConnection Set objOutlook = Application End Sub Sub OnDisconnection(ByVal RemoveMode As ext_DisconnectMode, ByRef custom As Variant()) _ Implements IDTExtensibility2.OnDisconnection End Sub Sub OnAddInsUpdate(ByRef custom As Variant()) Implements IDTExtensibility2.OnAddInsUpdate End Sub Sub OnStartupComplete(ByRef custom As Variant()) Implements IDTExtensibility2.OnStartupComplete End Sub Sub OnBeginShutdown(ByRef custom As Variant()) Implements IDTExtensibility2.OnBeginShutdown End Sub
Listing 1: Implementierung der Schnittstelle IDTExtensibility2
Ribbondefinition anpassen
Zum Anpassen der Ribbondefinition beginnen wir mit dem Hinzufügen eines Icons, das wir im Ribbon für eine neu zu erstellende Schaltfläche anzeigen wollen. Dieses fügen wir zum Projekt hinzu, indem wir im Bereich Ressources des Projektexplorers mit der rechten Maustaste auf den Eintrag ICON klicken und Add|Import File… auswählen. Im nun erscheinenden Dialog wählen wir die gewünschte .ico-Datei aus. Diese wird anschließend wie in Bild 4 angezeigt.
Bild 4: Ein neues Icon im Projektexplorer
Damit kommen wir zu der Funktion, die durch die Schnittstelle IRibbonExtensibility beim Laden des COM-Add-Ins ausgelöst wird. Diese heißt GetCustomUI und enthält einen Parameter namens RibbonID. Dieser wird gleich noch eine entscheidende Rolle spielen. Erst einmal gehen wir so vor, wie wir es auch bei COM-Add-Ins für die übrigen Office-Anwendungen getan haben. Dazu legen wir die Funktion GetCustomUI wie in Listing 2 an. Die Funktion stellt den Code der Ribbondefinition zusammen und gibt diesen als Funktionsergebnis zurück. Die Ribbondefinition enthält zunächst nur ein tab-Element mit einem group-Element und einem button-Element. Für das übergeordnete customUI-Element haben wir das Attribut loadImage mit dem Wert LoadImage hinterlegt. Diese Callbackprozedur hinterlegen wir ebenfalls in der Klasse:
Private Function GetCustomUI(ByVal RibbonID As String) As String Implements IRibbonExtensibility.GetCustomUI Dim strXML As String strXML &= "<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"" loadImage=""LoadImage"">" _ & vbCrLf strXML &= " <ribbon>" & vbCrLf strXML &= " <tabs>" & vbCrLf strXML &= " <tab id=""tab"" label=""Beispieltab"">" & vbCrLf strXML &= " <group id=""grp"" label=""Beispielgruppe"">" & vbCrLf strXML &= " <button id=""btn"" label=""Beispielbutton"" onAction=""onAction"" image=""mail.ico"" " _ & "size=""large""/>" & vbCrLf strXML &= " </group>" & vbCrLf strXML &= " </tab>" & vbCrLf strXML &= " </tabs>" & vbCrLf strXML &= " </ribbon>" & vbCrLf strXML &= "</customUI>" & vbCrLf Return strXML End Function
Listing 2: Implementierung der Schnittstelle IRibbonExtensibility
Function LoadImage(imageId As String) As IPictureDisp Return LoadResPicture(imageId, _ vbResBitmapFromIcon, 32, 32) End Function
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: