2012-03-14 28 views
6

Kontekst: Przygotowuję dodatek do programu Outlook 2007 w programie VS2010 w języku C#. Konkretną rzeczą, którą robię, jest dodanie elementu menu do menu kontekstowego powiązanego z wiadomością e-mail. Robię to przy użyciu następującego kodu:Dodatek do programu Outlook 2007: jak dodać ikonę do msoControlButton

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Application.ItemContextMenuDisplay += Application_ItemContextMenuDisplay; 
} 

private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
{ 
} 

private void Application_ItemContextMenuDisplay(Office.CommandBar commandBar, Outlook.Selection selection) 
{ 
    var cmdButtonCallContact = (Office.CommandBarButton)commandBar.Controls.Add(Office.MsoControlType.msoControlButton, 1, System.Reflection.Missing.Value, 6, System.Reflection.Missing.Value); 

    cmdButtonCallContact.Caption = "&Foo"; 
    //cmdButtonCallContact.Picture = ? 
    cmdButtonCallContact.Click += cmdButtonCopy_Click; 
} 

private void cmdButtonCopy_Click(Office.CommandBarButton ctrl, ref bool canceldefault) 
{ 
    System.Windows.Forms.MessageBox.Show("Bar"); 
} 

Problem: Nie można ustawić obrazu. Przykłady Msdn opierają się na funkcjach konwersji AxHost, których ja nie mam. Czy istnieje prosty sposób na ustawienie obrazu lub mapy bitowej na obraz?

Dzięki.

Odpowiedz

6

Jeśli chcesz własny obraz trzeba polegać na AxHost podejścia (see MSDN reference) lub PictureDispConverter co jest kolejnym podejściem created by Microsoft podstawie OleCreatePictureIndirect.

Jeśli chcesz używać wbudowanych ikon, możesz po prostu ustawić FaceId. Pobierz Office Icons Gallery, aby wyświetlić wartości Office 2007 FaceId.

+1

Jesteście niesamowici. Dzięki. – kmarks2

+0

Galeria ikon pakietu Office wydaje się już nie zawierać elementów Face ID. Tylko nowy styl o nazwie ikony. Wydaje się, że mają je na http://www.outlookexchange.com/articles/toddwalker/BuiltInOLKIcons.asp chociaż. –

3

Poniższy kod wykorzystuje System.Drawing.Bitmap (przechowywane jako zasób) i konwertuje go do obrazu, który jest przypisywany do Office.CommandBarButton.Picture

private Office.CommandBarButton buttonOne; 
void createbutton() 
{ 
    Office.CommandBar newMenuBar = Inspector.CommandBars.Add("EAD", Office.MsoBarPosition.msoBarTop, false, true); 
    buttonOne = (Office.CommandBarButton)newMenuBar.Controls.Add(Office.MsoControlType.msoControlButton, 1, missing, missing, true);buttonOne.Caption = "Ansari"; 
    buttonOne.Style = Office.MsoButtonStyle.msoButtonIconAndWrapCaptionBelow;     

    buttonOne.Picture = getImage(); 
    //Register send event handler 
    buttonOne.Click += buttonOne_Click; 
    newMenuBar.Visible = true; 
} 
void buttonOne_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault) 
{ 
    MessageBox.Show("Hi"); 
} 
private stdole.IPictureDisp getImage() 
{ 
    stdole.IPictureDisp tempImage = null; 
    try 
    { 
     System.Drawing.Bitmap newIcon = Properties.Resources.Icon1; 
     System.Windows.Forms.ImageList newImageList = new System.Windows.Forms.ImageList();        
     newImageList.Images.Add(newIcon); 
     tempImage = ConvertImage.Convert(newImageList.Images[0]); 
    } 
    catch (Exception ex) 
    { 
     System.Windows.Forms.MessageBox.Show(ex.Message); 
    } 
    return tempImage; 
} 
sealed public class ConvertImage : System.Windows.Forms.AxHost 
{ 
    private ConvertImage() : base(null) 
    { 
    } 

    public static stdole.IPictureDisp Convert(System.Drawing.Image image) 
    {    
     return (stdole.IPictureDisp)System.Windows.Forms.AxHost.GetIPictureDispFromPicture(image); 
    } 
}  

Uwaga: Dodaj obraz z nazwą icon1 w zasobie.

1

Po prostu, aby zastosować do obrazu dowolny wbudowany obraz biurowy (zobacz galerię obrazów w wersji here), można po prostu wywołać metodę GetImageMso().

CommandBarButton.Picture = Application.CommandBars.GetImageMso("ImageMSO", 16, 16); 

Jest to alternatywne podejście do korzystania z właściwości FaceID.

+0

Próbowałem tego, ale okazało się, że obraz nie wyświetla się poprawnie, przynajmniej w 2007 roku. Wydaje się, że utracił on przezroczysty atrybut, więc otrzymasz obrys wokół obrazu. Ponadto w programie Outlook potrzebny jest jeszcze jeden poziom przekierowania w celu wywołania funkcji: Globals.Addin.Application.ActiveExplorer(). CommandBars.GetImageMso ("AcceptInvitation", 16, 16); –

Powiązane problemy