Pergunta

Fundo:Estou desenvolvendo um suplemento do Outlook 2007 no VS2010 em C#.O que estou fazendo especificamente é adicionar um item de menu ao menu de contexto associado a um email.Eu faço isso com o seguinte código:

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:Não consigo definir a imagem.Os exemplos do Msdn dependem de funções de conversão do AxHost que eu não possuo.Existe uma maneira simples de definir apenas uma imagem ou bitmap como imagem?

Obrigado.

Foi útil?

Solução

Se você quiser uma imagem personalizada, você terá que confiar AxHost abordagem (veja a referência do MSDN) ou PictureDispConverter que é outra abordagem criado pela Microsoft baseado em OleCreatePictureIndirect.

Se você quiser usar os ícones integrados, basta definir o FaceId.Download Galeria de ícones do Office para visualizar o Office 2007 FaceId valores.

Outras dicas

O código a seguir usa um System.Drawing.Bitmap (armazenado como um recurso) e o converte em uma imagem, que pode ser atribuída 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);
    }
}     

Observação:Adicione a imagem com o nome Icon1 no recurso.

Apenas para sua informação, se você deseja aplicar qualquer imagem integrada do Office ao seu botão (veja a galeria de imagens em aqui), você pode simplesmente ligar GetImageMso() método.

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

Esta é uma abordagem alternativa ao uso FaceID propriedade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top