我有 ac# 插件,它有一个自定义功能区,但是,我没有按钮的图像。我没有 .bmp 文件,只有 .ico。如果可能的话,最好不要转换任何东西。
功能区是通过 xml 创建的,而不是 Visual Studio 功能区设计器
完成工作有两种可能的方法。它们都在 MSDN 中的为开发人员定制 2007 Office Fluent Ribbon文章中进行了描述:
元素的 loadImage 属性使您能够指定可以加载所有图像的回调。设置此回调过程后,Office 将调用回调过程并为每个加载图像的控件传递图像属性中的字符串。您不需要多次实现 getImage 回调,例如为每个需要图像的控件执行一次。
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
loadImage="GetImage">
<!-- Later in the markup -->
<button id="myButton" image="image.jpg" />
为了提供按钮的图像,Office 调用 GetImage 函数。它传递参数“mypic.jpg”并期望返回一个 IPictureDisp 对象。通过使用这种技术,您可以编写一个回调过程来返回您的自定义所需的所有图像,而无需编写每个单独控件的 getImage 回调。注意,调用 Ribbon 的 Invalidate 方法或 InvalidateControl 方法时不会再次调用 loadImage 回调。对于需要在运行时动态更改图像的控件,请使用 getImage 回调。
例如,回调可能如下所示:
public stdole.IPictureDisp GetImage(string imageName)
{
return
PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
}
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
loadImage="GetImage">
<!-- Later in the markup -->
<button id="myButton" getImage="GetImageCallback.jpg" />
getImage 回调方法必须返回一个 stdole.IPictureDisp 类型,因此您通常需要将您的图像转换为这种类型。要执行这些转换,您可以使用以下 PictureConverter 类,该类继承自 AxHost 类。
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);
}
}
例如,回调可能如下所示:
public stdole.IPictureDisp GetImageCallback(IRibbonControl control)
{
return
PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
}
选择哪种方式取决于您。
从将自定义图像添加到 excel 功能区中的按钮以及如何将 System.Drawing.Icon 转换为 System.Drawing.Image?:
在代码隐藏中,设置图像:
customButton1.Image = new Icon("icon.ico").ToBitmap();