Freitag, 10. Juli 2009

Outlook-Add-In: Items in einem beliebigen Ordner erstellen

In der Regel werden neue Items innerhalb eines Add-Ins für Microsoft Outlook mit Hilfe des akutellen Anwendungskontextes erstellt.

AppointmentItem appointment =
(AppointmentItem)this.Application.CreateItem(
Microsoft.Office.Interop.Outlook.OlItemType.olAppointmentItem)

Bei dieser Vorgehensweise werden dabei jeweils die Standard-Order für den entsprechenden Itemtyp gewählt. Das heißt für das hier gewählte Beispiel, dass der neue Termin in den Default-Kalender eingetragen werden würde.

Soll ein Item in einem anderen Ordner erstellt werden, so muss dies auf folgende Weise getan werden:

AppointmentItem appointment =
(AppointmentItem)folder.Items.Add(OlItemType.olAppointmentItem);

Ordner können ausgehend von den Root-Ordnern (this.Application.GetNamespace("MAPI").Folders) rekursiv ermittelt werden. Jeder Ordner gibt über folder.DefaultItemType den Typ der Items an, für die er vorgesehen wurde. Außerdem können Ordner anhand ihres Pfades (folder.FullFolderPath) identifiziert werden.

Outlook-Add-In: ein transparentes Icon verwenden

Gerade bei einem Add-In für Microsoft Outlook bietet es sich an, Icon-Buttons anstelle von normalen Buttons zu verwenden. Dies ist jedoch leider nicht so einfach möglich, wie bei WindowsForms- oder WPF-Applikationen.


Ablauf im Überblick:

  1. Button ermitteln / erzeugen
  2. Icon und Maske laden und konvertieren

Durchführung:


1. Button ermitteln / erzeugen

Im ersten Schritt wird überprüft, ob der Button bereits im Outlook vorhanden ist. Ist dies der Fall, wird er übernommen. Ansonsten wird er neu erzeugt. Daraufhin wird er entsprechend konfiguriert. Dabei wird sein Style auf msoButtonIcon gesetzt.

CommandBarButton button;
try
{
button =
(CommandBarButton)commandBars["Standard"].Controls[buttonCaption];
}
catch (System.Exception ex)
{
button =
(CommandBarButton)commandBars["Standard"].Controls.Add(
1,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value);

button.Caption = buttonCaption;
}

button.DescriptionText = "Description";

button.Style = MsoButtonStyle.msoButtonIcon;
button.Picture = getIcon();
button.Mask = getMask();

button.Click += new _CommandBarButtonEvents_ClickEventHandler(click);

2. Icon und Maske laden und konvertieren

Nun muss ein Icon erstellt werden. Zusätzlich muss eine schwarz-weiße Maske erstellt werden, welche die Transparenz des Icons beschreibt. Schwarz steht dabei für sichtbar, während weiß durchlässige Bereiche repräsentiert. Sowohl Icon, als auch Maske müssen 16x16 Pixel groß sein und können als BMP erstellt werden. Sie können dem Projekt als Ressource hinzugefügt werden und sind dann einfach wie im folgenden gezeigt erreichbar.

private static IPictureDisp getMask()
{
return AxHostConverter.ToPictureDisp(Properties.Resources.Icon);
}

private static IPictureDisp getIcon()
{
return AxHostConverter.ToPictureDisp(Properties.Resources.Mask);
}

Die CommandBarButtons eines Outlook-Add-Ins erwartet für die Eigentschaften Picture und Mask eine Instanz, die IPictureDisp implementiert. Da dies für Image und Bitmap nicht zutrifft, müssen die aus den Ressourcen geladenen Bilder zunächst konvertiert werden. Der einfachste Weg nach IPictureDisp zu konvertieren, ist die Erzeugung einer Unterklasse von AxHost.
 
internal class AxHostConverter : AxHost
{
private AxHostConverter() : base("") { }

static public stdole.IPictureDisp ToPictureDisp(Image image)
{
return (stdole.IPictureDisp)GetIPictureFromPicture(image);
}
}

Weitere Informationen:
  • nebem dem in diesem Beitrag verwendeten Weg gibt es auch noch einen erheblich umständlicheren Weg auf eingebette Resourcen zuzugreifen. Mehr Informationen dazu gibt es hier
  • eine umfassende Beschreibung, welche Möglichkeiten es gibt ein Image in ein IPictureDisp zu konvertieren findet sich hier