RibbonXを使う.

この前お話したWord2010でのオーサリングツールの仕事ですが、現在のWord2003ではメニューの種類は約48個あります.これ全部ツールバーにアルファベット順で組み込んでフローティング状態でWordに表示させています.お客さんはそれをマウスクリックしてオーサリングの作業しています.ツールバーはアイコン+コマンド名というフォーマットでダンゴ状になっていますが、これをWord2010に移行させるとなると1つのリボンのタブに押し込めるのはとてもできません.機能別にまとめるなりしてリボンの領域を節約しなければならないのですが、ユーザーインターフェースの核となる部分なのでどうしてもお客さんとの打ち合わせが必要です.設計には一番時間を取るところでしょう.一番頭の痛いところでした.
 
操作イメージをわかってもらうためにも、早くWord2010で動くプロトタイプを作るのが一番なのです.でも開発用に買ってもらったVisual Studio 2010のリボンエディタは初心者の私には非常に効率が悪く、またお客さんに試してもらうにもアドインのインストールや.Net Frameworkをインストールしてもらうなど結構大変です.なんとか良い方法がないものかとネットを探していたのですが、Office2007からリボンをXMLでデザインできる方法があるのを知りました.
 
 
このXMLはWord2010のOpen XML Format(.docx)ファイルの中に埋め込まれるのですが、便利なことに、それを編集するエディタもフリーで出ています.(まだβ2版なのでよくコケます.でもXMLを編集できるだけでなくアイコンファイルなどの画像ファイルが挿入できるのでとても便利です.)
 
 
イメージ 1
(画像はBrazucanetのRibbon Editor.tabの中にgroup、button、menuなどを配置してリボンを定義する.)
 
これであとは、良いアイコンがあればいうことはないのですが、Word2003で使っていたのはちょっと出来が悪かったので、使えるものはOffice2010の組み込みのアイコンを使ってみました.
 
 
イメージ 2
(画像は組み込みアイコンをWordで表示したところ.このアイコンのidをimageMso="..."で指定する.)
 
イラストレータも少し使いましたが、Windows7のペイントはXPよりはるかに出来が良くなっていて、文字などを半透明で作れます.これも結構利用しました.最後はフリーのアイコンエディタでアイコンファイル(.ico)にして先ほどのエディタで文書に放り込んでimage="..."で指定するだけです.
そこでできたのが次のような画面です.試しにVBAでコールバックを書いて少しだけ動くようにしたため、.docmファイルになっています.
 
イメージ 3
(画像はオーサリングツールのプロトタイプ.Word2010でオーサリング用のリボンを表示したところ)

考えてみれば、当初はWord2003+VBAから、Word2010+Visual Studio 2010のVSTO+VBに移行しなければならないだろうと思っていたのですが、まったくVisual Studioなしでまかなえてしまいました.お客さんにはこの.docmファイルだけを渡してWord2010で開いてUIを評価してもらうことができます.楽ですね~!
 
これから後はお客さんの要望に従ってXMLファイルを修正して、VBAのコールバックを書けばいけてしまうはずです.そのコールバックといえば、基本的にはWord2003のVBAをそのまま移行すれば動くはずです.
 
Visual Studioでシコシコやっていたらどうなっていたかと思います.確かにVSTO+VBでやれば、.NET Frameworkの機能が使えるのでプログラマにとっては非常に楽だし、高い機能も使えるのだろうけれども、お客さんの立場から見ると何か環境ばかり重くなるように思えます.VBA路線だと配布は基本的に.dotm(VBAが入っている)と.dotx(スタイルが入っている)だけで事足ります.
 
しかしVBAだとOSとのやり取りは、DLLを直接たたいたりして結構大変です.例えばこのオーサリングツールのVBAレジストリにアクセスしているので
 
Declare Function RegOpenKeyEx Lib "ADVAPI32.DLL" Alias "RegOpenKeyExA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
        ByVal samDesired As Long, phkResult As Long) As Long
 
なんていうコードがあります.こういうのはいまだにあの昔のVBの世界を彷彿とさせます.今の時代Win32の勉強もできるのでまた違った意味でVBAも良いのかもしれません.