在function区中使用.ico图像

我有ac#加载项,其中有一个自定义function区,但是,我没有button的图像。 我没有一个.bmp文件,只有一个。 如果可能的话,最好不要转换任何东西。



function区是通过xml创build的,而不是Visual Studio的Ribbondevise器

有两种可能的方式来完成工作。 这两个都在MSDN中自定义2007 Office Fluentfunction区开发人员文章中描述:

  1. 元素的loadImage属性使您可以指定一个可以加载所有图像的callback。 设置此callback过程后,Office将调用callback过程,并为加载图像的每个控件传递来自image属性的string。 您不需要多次实现getImagecallback,例如每个需要图像的控件都需要一次。

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="GetImage"> <!-- Later in the markup --> <button id="myButton" image="image.jpg" />

为了提供button的图像,Office调用GetImage函数。 它传递参数“mypic.jpg”,并期望返回一个IPictureDisp对象。 通过使用这种技术,您可以编写一个callback过程,返回您的自定义所需的所有图像,而无需编写每个控件的getImagecallback。 请注意,调用Ribbon的Invalidate方法或InvalidateControl方法时,不会再调用loadImagecallback。 对于需要在运行时dynamic更改图像的控件,请使用getImagecallback。

例如,callback可能如下所示:

  public stdole.IPictureDisp GetImage(string imageName) { return PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon); } 
  1. 当需要dynamic加载图像时,可以使用第二种方法。 您需要指定callback函数名称,而不是图像属性:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="GetImage"> <!-- Later in the markup --> <button id="myButton" getImage="GetImageCallback.jpg" />

getImagecallback方法必须返回一个stdole.IPictureDisptypes,所以你通常需要将你的图像转换为这种types。 要执行这些转换,可以使用以下inheritance自AxHost类的PictureConverter类。

  internal class PictureConverter : AxHost { private PictureConverter() : base(String.Empty) { } static public stdole.IPictureDisp ImageToPictureDisp(Image image) { return (stdole.IPictureDisp)GetIPictureDispFromPicture(image); } static public stdole.IPictureDisp IconToPictureDisp(Icon icon) { return ImageToPictureDisp(icon.ToBitmap()); } static public Image PictureDispToImage(stdole.IPictureDisp picture) { return GetPictureFromIPicture(picture); } } 

例如,callback可能如下所示:

  public stdole.IPictureDisp GetImageCallback(IRibbonControl control) { return PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon); } 

这取决于你select的方式。

从添加自定义图像到Excel中的buttonfunction区,以及如何将System.Drawing.Icon转换为System.Drawing.Image? :

在代码隐藏中,设置图像:

 customButton1.Image = new Icon("icon.ico").ToBitmap();