リボン アプリケーションの作成
Windows リボン フレームワークは、コントロールとそのビジュアル レイアウトを宣言する Extensible Application Markup Language (XAML) に基づくマークアップ言語と、コマンド機能とアプリケーション フックを定義するための C++ コンポーネント オブジェクト モデル (COM) ベースのインターフェイス セットという 2 つの異なる依存開発プラットフォームで構成されています。 リボン フレームワーク アーキテクチャ内のこの分業では、フレームワークによって提供される豊富な UI 機能を利用する開発者は、マークアップで UI を設計して記述し、リボン フレームワーク COM インターフェイスを使用してフレームワークをホスト アプリケーションに接続する必要があります。
リボン のロードマップ
表示されるコントロールや配置場所など、リボン アプリケーションの視覚的な側面はマークアップで宣言されます (「 リボン マークアップを使用してコマンドとコントロールを宣言する」を参照してください)。 ボタンが押されたときに何が起こるかなどのアプリケーション コマンド ロジックは、コードに実装されます。
リボンを実装して Windows アプリケーションに組み込むプロセスには、マークアップの記述、マークアップのコンパイル、コードの記述、アプリケーション全体のコンパイルとリンクという 4 つの基本的なタスクが必要です。
次の図は、一般的なリボン実装のワークフローを示しています。
以降のセクションでは、このプロセスについて詳しく説明します。
マークアップを記述する
リボン UI を設計した後、アプリケーション開発者の最初のタスクは、リボン マークアップを使用して UI を記述することです。
重要
リボン フレームワーク マークアップ スキーマ ファイル UICC.xsd は、Windows 7 および .NET Framework 4.0 用の Microsoft Windows ソフトウェア開発キット (SDK) と共にインストールされます。 標準インストール パスを使用すると、ファイルは %ProgramFiles%\Microsoft SDKs\Windows\[バージョン番号]\Bin フォルダーにあります。このフォルダーは、ヒントと自動補完を提供するために多くの XML エディターによって参照できます。
リボン コントロール、リボン コマンド (リボン コントロールの基本機能を提供するコントロールに依存しない要素)、およびすべてのコントロール レイアウトとビジュアル リレーションシップは、マークアップで宣言されます。 リボン マークアップの構造は、2 つのプライマリ ノード階層 (コマンドとリソース ツリーとビュー ツリー) を通じて、リボン コントロールとコマンドの違いを強調しています。
リボンによって公開されるすべてのコンテナーとアクションは、[ コマンドとリソース ] ツリーで宣言されます。 各 Command 要素は、UI デザインで必要に応じて、リソースのセットに関連付けられます。
アプリケーションのコマンドを作成した後、 Views ツリーでコントロールを宣言し、各コントロールを Command にバインドしてコマンド機能を公開します。 リボン フレームワークは、ここで宣言されているコントロール階層に基づいて、コントロールの実際の配置を決定します。
次のコード例は、Button コントロールを宣言し、Exit アプリケーションというラベルを付けて、Exit コマンドに関連付ける方法を示しています。
<Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">
<Application.Commands>
<Command Name="cmdExit" LabelTitle="Exit application" />
</Application.Commands>
<Application.Views>
<Ribbon>
<Ribbon.Tabs>
<Tab>
<Group>
<Button CommandName="cmdExit" />
</Group>
</Tab>
</Ribbon.Tabs>
</Ribbon>
</Application.Views>
</Application>
ヒント
リボン マークアップ ファイルには任意のファイル名拡張子を使用することもできますが、.xmlはドキュメント全体で使用することをお勧めします。
マークアップをコンパイルする
リボン マークアップ ファイルを作成した後は、Windows ソフトウェア開発キット (SDK) に含まれるリボン マークアップ コンパイラ UI コマンド コンパイラ (UICC) によってバイナリ形式でコンパイルする必要があります。 このバイナリ ファイルへの参照は、ホスト アプリケーションによるリボン フレームワークの初期化中に IUIFramework::LoadUI メソッドに渡されます。
UICC は、コマンド ライン ウィンドウから直接実行することも、Visual Studio で "カスタム ビルド ステップ" として追加することもできます。
次の図は、Windows 7 SDK CMD シェル ウィンドウの UICC マークアップ コンパイラを示しています。
次の図は、Visual Studio でカスタム ビルド ステップとして追加された UICC を示しています。
UICC は、マークアップのバイナリ バージョン (.bml)、リボン ホスト アプリケーションにマークアップ要素を公開する ID 定義ヘッダー (.h ファイル)、リボン イメージと文字列リソースをコンパイル時にホスト アプリケーションにリンクする リソース定義スクリプト (.rc ファイル) の 3 つのファイルを生成します。
リボン フレームワーク マークアップのコンパイルの詳細については、「リボン マークアップ のコンパイル」を参照してください。
アプリケーションをビルドする
リボン アプリケーションの準備 UI がマークアップで設計および実装されたら、フレームワークを初期化し、マークアップを使用し、マークアップで宣言されたコマンドをアプリケーション内の適切なコマンド ハンドラーにバインドするアプリケーション コードを記述する必要があります。
重要
リボン フレームワークは COM ベースであるため、リボン プロジェクトでは __uuidof() 演算子を使用して、リボン フレームワーク インターフェイス (IID) の GUID を参照することをお勧めします。 Microsoft 以外のコンパイラが使用されている場合やホスト アプリケーションが C ベースの場合など、__uuidof() 演算子を使用できない場合は、UUID.lib に含まれていないため、アプリケーションで IID を定義する必要があります。
アプリケーションによって IID が定義されている場合は、UIRibbon.idl で指定された GUID を使用する必要があります。
UIRibbon.idl は Windows ソフトウェア開発キット (SDK) の一部として出荷されており、%ProgramFiles%\Microsoft SDKs\Windows\v7.0\Include の標準インストール パスにあります。
リボンを初期化する
次の図は、単純なリボン アプリケーションを実装するために必要な手順を示しています。
次の手順では、単純なリボン アプリケーションを実装する方法について詳しく説明します。
Cocreateinstance
アプリケーションは、リボン フレームワーク クラス ID を使用して標準の COM CoCreateInstance 関数を呼び出して、フレームワークへのポインターを取得します。
IUIFramework* pFramework = NULL; HRESULT hr = ::CoCreateInstance( CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFramework)); if (FAILED(hr)) { return hr; }
Initialize(hwnd, IUIApplication*)
アプリケーションは IUIFramework::Initialize を呼び出し、リボンを含む最上位ウィンドウへのハンドルと、フレームワークがアプリケーションへのコールバックを行えるようにする IUIApplication 実装へのポインターという 2 つのパラメーターを渡します。
![重要]
リボン フレームワークは、シングルスレッド アパートメント (STA) として初期化されます。hr = pFramework->Initialize(hWndHost, pApplication); if (FAILED(hr)) { return hr; }
LoadUI(instance, resourceName)
アプリケーションは IUIFramework::LoadUI を呼び出してマークアップ リソースをバインドします。 この関数の最初のパラメーターは、リボン アプリケーション インスタンスへのハンドルです。 2 番目のパラメーターは、以前にコンパイルされたバイナリ マークアップ リソースの名前です。 バイナリ マークアップをリボン フレームワークに渡すことで、アプリケーションはリボン構造の内容とコントロールの配置方法を通知します。 また、実行時にコマンド関連のコールバックを行うときにフレームワークによって使用される、公開するコマンドのマニフェスト (Paste、Cut、Find など) もフレームワークに提供されます。
hr = pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON"); if (FAILED(hr)) { return hr; }
IUIApplication::OnCreateUICommand コールバック
手順 1 から 3 が完了すると、リボン フレームワークはリボンで公開するコマンドを認識します。 ただし、リボンが完全に機能する前に、フレームワークには、コマンドが実行されるタイミングをアプリケーションに通知する方法と、実行時にコマンド リソース (プロパティ) を取得する方法という 2 つのことが必要です。 たとえば、コンボ ボックスを UI に表示する場合、フレームワークはコンボ ボックスを設定する項目を要求する必要があります。
これら 2 つの機能は、 IUICommandHandler インターフェイスを介して処理されます。 具体的には、バイナリ マークアップで宣言されているコマンドごとに (上記の手順 3 を参照)、フレームワークは IUIApplication::OnCreateUICommand を呼び出して、そのコマンドの IUICommandHandler オブジェクトをアプリケーションに要求します。
Note
IUICommandHandler インターフェイスを使用すると、Command ハンドラーを 1 つ以上の Commands にバインドできます。
少なくとも、アプリケーションは、次の例に示すように、E_NOTIMPLを返す IUIApplication メソッド スタブを実装する必要があります。
STDMETHOD(OnViewChanged)(UINT32 viewId,
UI_VIEWTYPE typeID,
IUnknown *view,
UI_VIEWVERB verb,
INT32 uReasonCode)
{
return E_NOTIMPL;
}
STDMETHOD(OnCreateUICommand)(UINT32 commandId,
UI_COMMANDTYPE typeID,
IUICommandHandler **commandHandler)
{
return E_NOTIMPL;
}
STDMETHOD(OnDestroyUICommand)(UINT32 commandId,
UI_COMMANDTYPE typeID,
IUICommandHandler *commandHandler)
{
return E_NOTIMPL;
}
マークアップをアプリケーションにリンクする
この時点で、マークアップ リソース ファイルは、マークアップ リソース定義ファイル (マークアップ ヘッダー ファイルへの参照を含む) への参照をアプリケーション リソース ファイルに含めることで、ホスト アプリケーションにリンクする必要があります。 たとえば、ribbonUI.rc というリソース ファイルを持つ RibbonApp というアプリケーションでは、RibbonApp.rc ファイルに次の行が必要です。
#include "ribbonUI.rc"
使用されているコンパイラとリンカーによっては、リボン アプリケーションをコンパイルする前に、リソース定義スクリプトのコンパイルが必要になる場合もあります。 このタスクには、Microsoft Visual Studio と Windows SDK に付属する リソース コンパイラ (RC) コマンド ライン ツールを使用できます。
アプリケーションをコンパイルする
リボン アプリケーションをコンパイルしたら、それを実行し、UI をテストできます。 UI で調整が必要で、コア アプリケーション コード内の関連する Command ハンドラーに変更がない場合は、マークアップ ソース ファイルを修正し、マークアップを UICC.exeで再コンパイルし、新しいマークアップ リソース ファイルをリンクします。 アプリケーションが再起動されると、変更された UI が表示されます。
これはすべて、コア アプリケーション コードに触れることなく可能です。これは、標準のアプリケーションの開発と配布よりも大幅に改善されています。
実行時の更新と実行
リボン フレームワークの実行時通信構造は、プッシュおよびプル (双方向呼び出し元) モデルに基づいています。
このモデルを使用すると、フレームワークは Command の実行時にアプリケーションに通知し、フレームワークとアプリケーションの両方でプロパティ値とリボン リソースのクエリ、更新、無効化を行うことができます。 この機能は、さまざまなインターフェイスとメソッドを通じて提供されます。
フレームワークは、 IUICommandHandler::UpdateProperty コールバック メソッドを使用して、リボン アプリケーションから更新されたプロパティ情報をプルします。 更新する Command プロパティを識別する Command ID とプロパティ キーが メソッドに渡され、そのプロパティ キーの値がフレームワークに返されるか、プッシュされます。
フレームワークは、コマンドの実行時に IUICommandHandler::Execute を呼び出し、コマンド ID と発生した実行の種類 (UI_EXECUTIONVERB) の両方を識別します。 ここで、アプリケーションはコマンドの実行ロジックを指定します。
次の図は、フレームワークとアプリケーション間のコマンド実行の実行時通信を示しています。
注意
IUICommandHandler::UpdateProperty 関数と IUICommandHandler::Execute 関数を実装する必要はありません。 ただし、これらのメソッドは、ユーザーがコマンドを実行したときにアプリケーションが正しく機能することを確認するために必要です。
OLE サポート
リボン アプリケーションは、OLE サーバーとして構成して、配置外の OLE アクティブ化をサポートできます。
OLE サーバー アプリケーションで作成されたオブジェクトは、OLE クライアント アプリケーション (またはコンテナー) に挿入 (貼り付けまたは配置) したときに、サーバー アプリケーションとの関連付けを維持します。 インプレース OLE アクティブ化では、クライアント アプリケーションでオブジェクトをダブルクリックすると、サーバー アプリケーションの専用インスタンスが開き、編集用にオブジェクトが読み込まれます。 サーバー アプリケーションを閉じると、オブジェクトに加えられたすべての変更がクライアント アプリケーションに反映されます。
注意
リボン フレームワークでは、インプレース OLE アクティブ化はサポートされていません。 リボン ベースの OLE サーバーで作成されたオブジェクトは、OLE クライアント アプリケーション内から編集できません。 サーバー アプリケーションの外部専用インスタンスが必要です。
関連トピック