Deep Ribbon Part1

リボンの基礎

なにはともあれ、まずは、リボンをじっくりと見てみましょう。Windows 7 で標準提供されている「ペイント」を起動してください。

ペイント_リボン1_1_2

  • アプリケーションメニュー
    アプリケーションメニューは Windows リボン フレームワークを操作するアプリケーション用のメインメニューになります。
  • クイック アクセス ツールバー(Quick Access Toolbar)
    常に表示させておきたい機能(上書き保存や元に戻す、印刷、印刷プレビューなどの機能)を表示しておくツールバーです。
  • タブ
    コントロールの集合体です。リボンでは、タブを 1 つのタスク集合体としてコントロールをグループ化して、デザインします。
  • グループ
    タブの中にあり、関連したコントロールをセパレーターで区切った領域です。
  • エンハンスツールチップ
    コントロールが選択された際、ユーザーに機能を説明するために表示するツールチップです。

リボンを構成する各部品の名前はプログラミングの際にも必要になりますので、覚えておいてください。
では、文字を入力してみます。すると、次のようにコンテキスト タブ セットがハイライト表示され、文字入力というタスクで使えるコンテキスト タブが表示されます。

ペイント_リボン1_1_4

リボンは、適応型レイアウト(反時計回り)を採用しているため、アプリケーション ウィンドウの大きさによって、リボン自体も大きさが変更されていきます。ペイントの左右の大きさのみを少しずつ小さくしていくと、適応型レイアウトの動きがわかります。

ペイント_リボン2

ペイント_リボン3 ペイント_リボン4 ペイント_リボン5

リボンの特徴をまとめておくと、次にようになります。

リボンの特徴

  • タスク志向のレイアウトデザインであり、コマンドが一連のタブにまとまっている
  • 適応型レイアウトをとり、アプリケーションウィンドウの大きさによって、リボンの大きさも変更される
  • よく使うコマンドはクイックアクセスツールバーに登録することができる
  • リボン タブ内のコントロールは関連するコマンド毎にグループ化されている
  • 特定のタスクを行う際、コンテキストタブが表示され、タスクで行う一連のコマンドが集約されている

リボンフレームワーク

Windows には、Windows Common Control と呼ばれる OS 標準のコントロール群が存在しています。最新の Windows Common Control は、バージョン 6.1 であり、26 個のコントロールが提供されています。Windows Common Control は、ComCtl32.dll で実装されていますが、リボンはどうでしょうか。
リボンも大きな意味では、”コモンコントロール”と言えるかもしれませんが、リボンは、”コントロール”という部品ではなく、”フレームワーク”として提供されていて、Windows Common Control のように Windows メッセージベースの部品ではなく、COM インターフェースの基に提供されています。そのため、アプリケーション開発者がリボンを実装する場合には、リボンフレームワークの COM インターフェースを利用して、リボンを実装する(組み込む)ことになります。
リボンフレームワークは、UIRibbon.dll、UIRibbonRes.dll によって提供されており、大きく次の 2 つのコンポーネントから構成されています。

  • リボン コマンドバー
  • リッチ コンテキスト メニュー

これらは、各コンポーネントに対応するビューを見ることで、その役割を理解できます。なお、サンプルには Microsoft Word 2010 を使用しています。

リボンのビュー

リボン コマンドバーに対応するビューは、リボン ビューです。リボン ビューにはクイックアクセスツールバーやタブ等が含まれます。そして、リッチ コンテキスト メニューに対応するビューは、コンテキスト ポップアップ ビューです。コンテキスト ポップアップ ビューには、ミニ ツールバーとコンテキストメニューが含まれます。
リボンは、適応型レイアウトと記述しましたが、これらのレイアウトを動かしているのは、リボンフレームワークです。
次に、リボンフレームワークの動作原理を説明します。
アプリケーションがリボンフレームワークの COM を呼び出し、アプリケーションはリボンフレームワークが提供している COM インターフェースからの派生クラスを実装することで、リボンフレームワークからのコールバックを受け取り、リボンは動作します。Windows Common Control との最大の違いは、Windows メッセージベースで動作するのではなく、COM インターフェースのメソッド呼び出しで動作するということです。この動きは、非常に重要ですので、ぜひ、覚えておいてください。

リボンコールバック2

では、リボンフレームワークを構成する COM を紹介します。

【リボンフレームワーク側の COM インターフェース】

COM インターフェース名 意味、用途
IUIFramework リボンビューやコンテキストポップアップビューのコア機能を提供するメソッドを定義しているリボンフレームワークの中心的な COM インターフェース
IUIRibbon リボンビューのプロパティ設定を行うメソッドを定義している
IUIContextualUI コンテキストポップアップビューの機能を定義している
IUICollection 実行時に、リボン内のコントロール群(リボン ギャラリー)を動的に管理する
IUISimplePropertySet IUICollection オブジェクトを管理し、プロパティ キーとして使用する
IUIImage リボン用の画像を処理する
IUIImageFromBitmap IUIImage オブジェクトを生成するために使用する

【アプリケーション側で派生クラスを実装する COM インターフェース】

COM インターフェース名 意味、用途
IUIApplication リボンフレームワークからのコールバック呼び出しのエントリーポイント
IUICommandHandler アプリケーションでリボンのイベント発生時の動作を実装しておき、リボンフレームワークから呼び出される
IUICollectionChangeEvent 実行時にリボン内のコントロール群(リボン ギャラリー)が変更された際にリボンフレームワークから呼び出される

リボンフレームワークの COM インターフェースの中で特に重要な IUIFramework インターフェース、IUIApplication インターフェース、および IUICommandHandler インターフェースについて詳しく見ていきます。
IUIFramework インターフェ―スは、リボンフレームワークの中心になる COM インターフェースです。アプリケーションは、初めに、このインターフェースを呼び出して、一連のリボン初期化処理を行います。その際、アプリケーション側に実装する IUIApplication インターフェースの派生クラスのポインターを登録することで、リボンフレームワークからのコールバックが行われます。リボンフレームワークからのコールバックには、リボンビュー内のコマンド実行、ビューの変更、そして、リボンの終了処理があり、イベントの発生毎に呼び出されます。

リボンフレームワーク呼び出しとコールバック

リボンフレームワークからのコールバックを受信すると、IUIApplication インターフェースの派生クラスでは、リボン内のコントロール処理(例えばコントロールがクリックされた)と判定した場合、COM の集約(Aggrigation)を使い、リボンフレームワークに対して、IUICommandHandler インターフェースの派生クラスのポインターを返します。すると、リボンフレームワークは、IUICommandHandler インターフェースのメソッドを呼び出して、アプリケーションで実装したコマンド処理を実行させます。このようにリボンは、リボンフレームワークの COM とアプリケーション側の COM との間で、COM メソッド呼び出しを相互に行って動いています。
なお、リボンの各コマンドは、リボン内の各コントロールに割り当てた一意のコマンド ID を使用して識別しています。このため、リボン内の各コントロールとコマンド ID の関連付けが必要になりますが、これらの関連付けは、Windows Ribbon Command System によって実現されています。

リボンコマンドシステム

Windows Ribbon Command System がコマンドとコントロールとの間を介入するため、リボンでは、コマンドの実装とコントロールの実装とを完全に分離/独立した構造をとることができます。

リボンの実装方法

リボンは、コマンドとコントロールが完全に独立した構造となっているため、実装面でもコマンド部分とコントロール部分とを完全に分離したコードビハインドによる開発となります。
コントロール部分であるビュー(UI 部分)を XML フォーマットによる XAML(Extensible Application Markup Language)ファイルを作成して定義し、コマンドの動作(ハンドラー)部分を C++ による COM プログラミングとしてコードファイルに実装し、最終的にこれらをビルドします。

開発の流れ

  1. 開発者(もしくはデザイナー)は、リボンの UI を定義した XAML ファイルを作成します。
  2. XAML ファイルを「リボン コンパイラ(UI Command Compiler: UICC.EXE)」の入力ファイルとして、コンパイルして、リボン用リソースファイルを生成します。リボンコンパイラによって、ID が定義されたヘッダーファイル、リボン用リソーススクリプトが定義されたリソースファイル、リボン用リソースバイナリーが格納されたマークアップバイナリファイルの 3 つが生成されます。
  3. 開発者は、リボンの実際の動作を実装するべく、リボン フレームワーク用の COM を使い、リボンコマンドハンドラーを作成します。
  4. ヘッダーファイル、リソースファイル、マークアップバイナリファイル、コードファイルのすべてを使い、Visual Studio でビルドすることで、リボンアプリケーションが完成します。

Part2 では、リボンマークアップ、リボンコマンドの実装方法について紹介していきます。