リボンXMLのボタンコマンドでイメージを実装する方法(多分、中級編)

前回はリボンXMLの基礎編ですが、今回は中級編でしょうか。

絶対にニーズはあるのですが、ちゃんと取り扱えている情報がない(あっても間違えているような。。。)リボンXMLにイメージを取り込む方法についてご紹介したいと思います。

以下のページに記載はあるのですが、少しコーディングが間違えているのか、ちゃんと動きません。そして、直訳しているだけで、分かっている人が訳したわけではないので、やっぱり、わかりづらい。。。

2007 Office Fluent リボンをカスタマイズする (開発者向け) (パート 1/3) イメージを読み込む

https://msdn.microsoft.com/ja-jp/library/aa338202.aspx#OfficeCustomizingRibbonUIforDevelopers_Images

ですので動くようにしたものを下記に記載いたします。

準備:

前回利用したプロジェクトを利用します。

手順:

1. 追加したい任意イメージをリソースファイルとして追加します。

[プロジェクト]-[プロパティ]-[リソースの追加]-[既存のファイルの追加]

 

Resouce

 

前回利用した Ribbon1.xml の button タグに image 要素(image="HOME")を追加します。ここでは Resource に HOME という名前でイメージを追加しています。
ここでは onLoad="Ribbon_Load" コールバックのあとに、定義されたすべてのイメージを読み込むloadImage="GetImage" コールバック要素を定義します。

説明が難しいので(笑)上記ページからの抜粋です。

<customUI> 要素の loadImage 属性を使用すると、すべてのイメージを読み込むことができるコールバックを指定できます。このコールバック プロシージャを設定したら、Office がそのコールバック プロシージャを呼び出し、イメージを読み込む各コントロールのイメージ属性の文字列を渡します。getImage コールバックを複数回、たとえば、イメージを必要とするコントロールごとに実装する必要はありません。たとえば、カスタマイズには次のようなマークアップが含まれる場合があります。

<?xml version="1.0" encoding="UTF-8"?>

<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load"
loadImage="GetImage">

  <ribbon>

    <tabs>

      <tab idMso="TabAddIns">

        <group id="MyGroup"

               label="My Group">

          <button id="リボンテスト" label="リボンテスト"

                  size="large" image="HOME" onAction="RibbonTest"/>

        </group>

      </tab>

    </tabs>

  </ribbon>

</customUI>

2. Ribbon1.cs の IRibbonExtensibilityの領域に以下のコードを記述します。

以下のコードの意味ですが、イメージタイプを変換するクラスです。ここも説明が難しいので(笑)、以下抜粋です。

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

         }

}

3. 次にリボンのコールバック領域に以下のコードを記述します。(上記のページではここが動きませんでしたので、少し修正しています。)

public stdole.IPictureDisp GetImage(string HOME)

   {

       return

           PictureConverter.ImageToPictureDisp(Properties.Resources.HOME);
//記事だとIconToPictureDispになって動きませんでした。

   }

4. デバッグしてみます。以下のようにリソースファイルに追加したイメージがボタンコントロールに表示されます。

 

ribbonIcon

こういう情報は分かっている人は分かっているんですよね。本当は。

でも、情報を公開する余裕がない人とか商売でやっている人とかでなかなか情報が出てこない。

僕がやっていることはどうなんでしょうね。時間的に公開する余裕も少ないですが、別に商売にもならない。正直、僕の仕事からするとあまり必要性がない分野です。

圧倒的に少ない情報をなんとかしたいという思いとOffice 開発者の底上げが目的です。

でも、最近、この思いが空振りぎみです。残念ながら。。。(笑)