2012-03-14 13 views
6

Antecedentes: estoy desarrollando un complemento de Outlook 2007 en VS2010 en C#. Lo específico que estoy haciendo es agregar un elemento de menú al menú contextual asociado con un correo electrónico. Lo hago con el siguiente código:Complemento de Outlook 2007: cómo agregar un ícono 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: parece que no puede establecer la imagen. Los ejemplos de MSDN se basan en las funciones de conversión de AxHost que yo no tengo. ¿Hay alguna forma sencilla de establecer una imagen o mapa de bits en la imagen?

Gracias.

Respuesta

6

Si quieres una imagen personalizada que tiene que confiar en AxHost enfoque (see MSDN reference) o PictureDispConverter que es otro enfoque basado en created by MicrosoftOleCreatePictureIndirect.

Si desea utilizar los iconos integrados, puede configurar el FaceId. Descargue Office Icons Gallery para ver los valores de Office 2007 FaceId.

+1

Usted señor es increíble. Gracias. – kmarks2

+0

La Galería de iconos de Office ya no parece tener FaceIds. Solo el nuevo estilo llamado íconos. Sin embargo, parecen tenerlos en http://www.outlookexchange.com/articles/toddwalker/BuiltInOLKIcons.asp. –

3

El siguiente código utiliza un System.Drawing.Bitmap (almacenado como recurso) y la convierte en una imagen, que es asignable 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: Añadir imagen con el nombre Icon1 en recursos.

1

Solo, para su información, si desea aplicar cualquier imagen incorporada en la oficina a su botón (vea la galería de imágenes en here), simplemente puede llamar al método GetImageMso().

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

Este es un enfoque alternativo al uso de la propiedad FaceID.

+0

Lo intenté pero descubrí que la imagen no se muestra correctamente, al menos en 2007. Parece que pierde el atributo transparente, por lo que se obtiene un contorno alrededor de la imagen. Además, en Outlook necesita un nivel más de redirección para llamar a la función: Globals.Addin.Application.ActiveExplorer(). CommandBars.GetImageMso ("AcceptInvitation", 16, 16); –

Cuestiones relacionadas