#0. はじめに
Freeradicalの中の人、yamarahです。
RibbonにIcon画像を表示するには、
ButtonDefinition Inventor.Application.CommandManager.ControlDefinitions.AddButtonDefinition(
string DisplayName,
string InternalName,
CommandTypesEnum Classification,
object ClientId,
string DescriptionText = "",
string ToolTipText = "",
object StandardIcon = null,
object LargeIcon = null,
ButtonDisplayEnum ButtonDisplay = ButtonDisplayEnum.kDisplayTextInLearningMode
);
のStandardIcon
とLargeIcon
に画像を指定するわけですが、その形式で戸惑うかもしれません。
これらには、Picture (IPictureDisp)形式のオブジェクトで、それをどう用意すれば良いのかが、なかなかと難しいのです。
ここでは、IPictureDisp形式の画像を作成する方法を2つ紹介します。
#1. AxHostを使う方法
VB.netだと簡単な方法があるらしいですが、C#だと次の方法をとります。
using stdole;
using System.Drawing;
using System.Windows.Forms;
class AxHostConverter : AxHost
{
private AxHostConverter() : base("") { }
static public IPictureDisp ImageToPictureDisp(Image image)
{
return (IPictureDisp)GetIPictureDispFromPicture(image);
}
static public Image PictureDispToImage(IPictureDisp pictureDisp)
{
return GetPictureFromIPicture(pictureDisp);
}
}
System.Windows.Forms.AxHostには、ImageとIPictureDispを相互変換するstaticな関数GetIPictureDispFromPicture
とGetPictureFromIPicture
が用意されているので、単にそれを呼べば済みそうなものです。
しかし、残念ながらこれらの関数はprotectedが指定されているので、AxHostを継承してpublicなwrapper関数を持ったclassを作る必要があるわけです。
#2. OleCreatePictureIndirectを使う方法
WPFに移行してFormsフリーにしたい場合は、AxHostを利用せずOleAut32.dllのOleCreatePictureIndirect
を使って変換する方法もあります。
下記リンクにあるコードは、私の環境では問題なく動作しました。
How to convert Icon/Bitmap to IPictureDisp without VisualBasic.Compatibility.VB6.Support.IconToIPicture?
Formsへの依存は無くなりますが、その代わりにOleAut32.dllが必須となります。
#99. 親の記事に戻る
Autodesk Inventor API Hacking (概略)