Suplemento do Outlook 2007:Como adicionar um ícone a um msoControlButton
-
14-12-2019 - |
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.
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.