2012-03-14 10 views
6

Contesto: Sto sviluppando un componente aggiuntivo di Outlook 2007 in VS2010 in C#. La cosa specifica che sto facendo è aggiungere una voce di menu al menu contestuale associato a un'email. Lo faccio con il seguente codice:Componente aggiuntivo Outlook 2007: Come aggiungere un'icona a un 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"); 
} 

Problema: Non riesco a impostare l'immagine. Gli esempi Msdn si basano su funzioni di conversione AxHost che non ho. C'è un modo semplice per impostare solo un'immagine o una mappa di bit per l'immagine?

Grazie.

risposta

6

Se si desidera un'immagine personalizzata si può contare solo su AxHost approccio (see MSDN reference) oppure PictureDispConverter che è un altro approccio created by Microsoft sulla base di OleCreatePictureIndirect.

Se si desidera utilizzare le icone integrate, è sufficiente impostare FaceId. Scarica Office Icons Gallery per visualizzare i valori di Office 2007 FaceId.

+1

Lei signore è fantastico. Grazie. – kmarks2

+0

La Galleria icone di Office non sembra avere più FaceId. Solo il nuovo stile chiamato icone. Sembrano averli su http://www.outlookexchange.com/articles/toddwalker/BuiltInOLKIcons.asp però. –

3

Il codice seguente utilizza un System.Drawing.Bitmap (memorizzata come risorsa) e lo converte in un'immagine, che è assegnabile a 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); 
    } 
}  

Nota: Aggiungi immagine con nome Icon1 in risorsa.

1

Solo FYI, se si desidera applicare al proprio pulsante qualsiasi immagine incorporata di Office (visualizzare la galleria di immagini in here), è sufficiente chiamare il metodo GetImageMso().

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

Questo è un approccio alternativo all'utilizzo della proprietà FaceID.

+0

L'ho provato, ma ho rilevato che l'immagine non viene visualizzata correttamente, almeno nel 2007. Sembra che perda l'attributo trasparente, in modo da ottenere un contorno intorno all'immagine. Inoltre, in Outlook è necessario un ulteriore livello di reindirizzamento per chiamare la funzione: Globals.Addin.Application.ActiveExplorer(). CommandBars.GetImageMso ("AcceptInvitation", 16, 16); –

Problemi correlati