Надстройка Outlook 2007: как добавить значок в msoControlButton - PullRequest
6 голосов
/ 14 марта 2012

Справочная информация: я разрабатываю надстройку Outlook 2007 в VS2010 на C #. Конкретная вещь, которую я делаю, это добавление пункта меню в контекстное меню, связанное с электронной почтой. Я делаю это с помощью следующего кода:

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");
}

Проблема: не могу установить изображение. Примеры Msdn опираются на функции преобразования AxHost, которых у меня нет. Есть ли простой способ установить Image или BitMap в Picture?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 14 марта 2012

Если вы хотите, чтобы пользовательское изображение использовалось для подхода AxHost ( см. Ссылку MSDN ) или PictureDispConverter, что является другим подходом создано Microsoft на основе OleCreatePictureIndirect.

Если вы хотите использовать встроенные значки, вы можете просто установить FaceId. Загрузите Галерея значков Office для просмотра значений Office 2007 FaceId.

3 голосов
/ 02 января 2013

Следующий код использует System.Drawing.Bitmap (хранится как ресурс) и преобразует его в изображение, которое можно присвоить 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);
    }
}     

Примечание: Добавить изображение с именем Icon1 в ресурс.

1 голос
/ 07 марта 2013

Просто к вашему сведению, если вы хотите применить какие-либо встроенные офисные изображения к вашей кнопке (смотрите галерею изображений в здесь ), вы можете просто вызвать GetImageMso () метод.

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

Это альтернативный подход к использованию свойства FaceID.

...