IUIFramework
COM公式ドキュメント
IUIFramework インターフェイスは Windows リボン フレームワークによって実装され、フレームワークの中核機能を提供するメソッドを定義します。
解説(Remarks)
このインターフェイスは、リボン フレームワークの初期化と破棄に使用します。
リボン フレームワークの UI 機能は View によって区別されます。View とは、本質的には Ribbon や ContextPopup といった、組み込みのコア コントロールです。
IUIFramework の実装へのインターフェイス ポインターを取得するには、CoCreateInstance を使用して、クラス識別子 (CLSID) が CLSID_UIRibbonFramework の COM オブジェクトを作成します。
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ホスト アプリケーションを Windows リボン フレームワークに接続します。
| frameWnd | HWND | in | リボンを格納するトップレベル ウィンドウへのハンドル。 |
| application | IUIApplication* | in | ホスト アプリケーションの IUIApplication 実装へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。
| 値 | 説明 |
|---|---|
| HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) | frameWnd が NULL であるか、既存のウィンドウを指していないか、デスクトップのトップレベル ウィンドウではありません。
メモ このエラーは、frameWnd が子ウィンドウ (WS_CHILD) である場合、ツール ウィンドウ (WS_EX_TOOLWINDOW) として宣言されている場合、またはキャプション プロパティを持たない場合 (WS_CAPTION は必須) にも返されます。
|
| HRESULT_FROM_WIN32(ERROR_WINDOW_OF_OTHER_THREAD) | frameWnd が実行スレッドによって所有されていません。 |
| E_POINTER | application が NULL であるか、無効なポインターです。 |
解説(Remarks)
このメソッドは、リボンを必要とするトップレベル ウィンドウごとに、ホスト アプリケーションから呼び出す必要があります。
このメソッドは、リボン フレームワークがホスト アプリケーション内のコールバックを呼び出せるようにするためのフックを設定するために使用されます。
リボンを正しく初期化するには、コンパイル済みのリボン マークアップ ファイルがリソースとして利用可能であり、後続の IUIFramework::LoadUI の呼び出しで指定される必要があります。このマークアップ ファイルはフレームワークに不可欠な構成要素であり、使用するコントロールとそのレイアウトを指定します。
IUIFramework::Initialize が成功した場合:
- リボンと従来のコマンド モデルとの間の不整合、重複、非互換性を排除するため、リボン フレームワークはホスト アプリケーションのトップレベル ウィンドウから標準のメニュー バーを削除します。
- フレームワークは WS_EX_CLIENTEDGE スタイルへの参照を削除します。メモ WS_EX_CLIENTEDGE スタイルは、ウィンドウが沈んだ縁の境界線を持つことを指定します。このスタイルは、リボンとホスト アプリケーションの統合において視覚的な支障となります。
- フレームワークは WS_SYSMENU スタイルが有効であることを必要とします。WS_SYSMENU が有効でない場合、フレームワークは代替機能を提供せず、リボンの描画が予期しない結果になる可能性があります。メモ WS_SYSMENU スタイルは、アプリケーション ウィンドウのタイトル バーにシステム メニューを持つことを指定します。これに伴い、WS_CAPTION スタイルも指定する必要があります (上記の 戻り値 の ERROR_INVALID_WINDOW_HANDLE を参照してください)。
例
次の例は、基本的なフレームワーク初期化関数を示しています。
//
// FUNCTION: InitializeFramework(HWND)
//
// PURPOSE: Initialize the Ribbon framework and bind a Ribbon to the application.
//
// PARAMETERS:
// hWnd - Handle to the Ribbon host application window.
//
// COMMENTS:
//
// In order to get a Ribbon to display, the Ribbon framework must be initialized.
// This involves three important steps:
// 1) Instantiate the Ribbon framework object (CLSID_UIRibbonFramework).
// 2) Pass the host HWND and IUIApplication object to the framework.
// 3) Load the binary markup compiled by the UI Command Compiler (UICC.exe).
//
//
bool InitializeFramework(HWND hWnd)
{
// Instantiate the Ribbon framework object.
HRESULT hr = CoCreateInstance(
CLSID_UIRibbonFramework,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&g_pFramework));
if (!SUCCEEDED(hr))
{
return false;
}
// Create the application object (IUIApplication) and call the
// framework Initialize method, passing the application object and the
// host HWND that the Ribbon will attach itself to.
CComObject<CApplication> *pApplication = NULL;
CComObject<CApplication>::CreateInstance(&pApplication);
hr = pApplication->QueryInterface(&g_pApplication);
if (!SUCCEEDED(hr))
{
return false;
}
hr = g_pFramework->Initialize(hWnd, g_pApplication);
if (!SUCCEEDED(hr))
{
return false;
}
// Load the binary markup.
// Initiate callbacks to the IUIApplication object that was
// provided to the framework earlier and bind command handler(s)
// to individual commands.
hr = g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
if (!SUCCEEDED(hr))
{
return false;
}
return true;
}
Windows リボン フレームワークのインスタンスに関するすべてのオブジェクト、フック、参照を終了して解放します。
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。
解説(Remarks)
このメソッドは、IUIFramework のインスタンスごとに 1 回呼び出す必要があります。
IUIFramework::Initialize を呼び出した場合は、リソースを解放してフレームワークを適切に破棄するために、IUIFramework::Destroy を呼び出す必要があります。IUIFramework::Destroy を呼び出さないと、メモリ リークが発生する可能性があります。
Windows リボン フレームワークの UI リソース ファイル (コンパイル済みマークアップ) を読み込みます。
| instance | HINSTANCE | in | リボン アプリケーション インスタンスへのハンドル。 |
| resourceName | LPWSTR | in | コンパイル済みのバイナリ マークアップを含むリソースの名前。 メモ リボンを正しく初期化するには、コンパイル済みのリボン マークアップ ファイルがリソースとして利用可能である必要があります。このマークアップ ファイルはリボン フレームワークに不可欠な構成要素であり、使用するコントロールとそのレイアウトを指定します。
|
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。
解説(Remarks)
IUIFramework::LoadUI は初期化時に呼び出す必要があります。このメソッドは、間に IUIFramework::Destroy の呼び出しを挟むことを条件として、アプリケーションのライフサイクル中に複数回呼び出すことができます (たとえば、リボンの表示や非表示を切り替える場合)。
OnCreateUICommand と OnViewChanged は、IUIFramework::LoadUI の実行中に呼び出されます。
例
次の例は、基本的なフレームワーク初期化関数を示しています。
//
// FUNCTION: InitializeFramework(HWND)
//
// PURPOSE: Initialize the Ribbon framework and bind a Ribbon to the application.
//
// PARAMETERS:
// hWnd - Handle to the Ribbon host application window.
//
// COMMENTS:
//
// In order to get a Ribbon to display, the Ribbon framework must be initialized.
// This involves three important steps:
// 1) Instantiate the Ribbon framework object (CLSID_UIRibbonFramework).
// 2) Pass the host HWND and IUIApplication object to the framework.
// 3) Load the binary markup compiled by the UI Command Compiler (UICC.exe).
//
//
bool InitializeFramework(HWND hWnd)
{
// Instantiate the Ribbon framework object.
HRESULT hr = CoCreateInstance(
CLSID_UIRibbonFramework,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&g_pFramework));
if (!SUCCEEDED(hr))
{
return false;
}
// Create the application object (IUIApplication) and call the
// framework Initialize method, passing the application object and the
// host HWND that the Ribbon will attach itself to.
CComObject<CApplication> *pApplication = NULL;
CComObject<CApplication>::CreateInstance(&pApplication);
hr = pApplication->QueryInterface(&g_pApplication);
if (!SUCCEEDED(hr))
{
return false;
}
hr = g_pFramework->Initialize(hWnd, g_pApplication);
if (!SUCCEEDED(hr))
{
return false;
}
// Load the binary markup.
// Initiate callbacks to the IUIApplication object that was
// provided to the framework earlier and bind command handler(s)
// to individual commands.
hr = g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
if (!SUCCEEDED(hr))
{
return false;
}
return true;
}
IUIRibbon や IUIContextualUI など、Windows リボン フレームワークの View を表すインターフェイスへのポインターのアドレスを取得します。
| viewId | DWORD | in | View の ID。 Ribbon の場合は値 0、ContextPopup の場合はその Command.Id を指定します。 |
| riid | GUID* | in | IUIRibbon または IUIContextualUI のインターフェイス ID。 |
| ppv | void** | out | このメソッドが返るとき、IUIRibbon オブジェクトまたは IUIContextualUI オブジェクトへのポインターのアドレスが格納されます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。
| 値 | 説明 |
|---|---|
| E_INVALIDARG | riid が有効なインターフェイス ID ではありません。 |
| E_FAIL | 操作が失敗しました。 |
解説(Remarks)
リボン フレームワークの UI 機能は View によって区別されます。View とは、本質的には Ribbon や ContextPopup といった、組み込みのコア フレームワークです。
アプリケーションの存続期間を通じてインターフェイスへのポインターを保持するのではなく、IUIFramework::GetView を使用することで、ホスト アプリケーションは一時的なインターフェイス ポインターを作成し、必要に応じてメソッドを呼び出すことができます。
例
次の例は、IUIFramework::GetView メソッドを使用して Ribbon View オブジェクトを取得し、GetHeight メソッドを呼び出してリボンの高さを取得し、その高さに基づいて Context Popup コントロールの表示位置を計算する方法を示しています。
void GetDisplayLocation(POINT &pt, HWND hWnd)
{
if (pt.x == -1 && pt.y == -1)
{
HRESULT hr = E_FAIL;
// Display the menu in the upper-left corner of the client area, below the ribbon.
IUIRibbon* pRibbon;
hr = g_pFramework->GetView(0, IID_PPV_ARGS(&pRibbon));
if (SUCCEEDED(hr))
{
UINT32 uRibbonHeight = 0;
hr = pRibbon->GetHeight(&uRibbonHeight);
if (SUCCEEDED(hr))
{
pt.x = 0;
pt.y = uRibbonHeight;
// Convert client coordinates of a specified point to screen coordinates.
ClientToScreen(hWnd, &pt);
}
pRibbon->Release();
}
if (FAILED(hr))
{
// Default to just the upper-right corner of the entire screen.
pt.x = 0;
pt.y = 0;
}
}
}
コマンドのプロパティ、値、または状態を取得します。
| commandId | DWORD | in | コマンドの ID。マークアップ リソース ファイルで指定されます。 |
| key | PROPERTYKEY* | in | コマンドのプロパティ、値、または状態のプロパティ キー。 |
| value | PROPVARIANT* | out | このメソッドが返るとき、プロパティ、値、または状態が格納されます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。
| 値 | 説明 |
|---|---|
| HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) | そのプロパティ、値、または状態は IUIFramework::GetUICommandProperty をサポートしていません。
|
| E_FAIL | 操作が失敗しました。 |
コマンドのプロパティ、値、または状態を設定します。
| commandId | DWORD | in | コマンドの ID。マークアップ リソース ファイルで指定されます。 |
| key | PROPERTYKEY* | in | コマンドのプロパティ、値、または状態のプロパティ キー。 |
| value | PROPVARIANT* | in | プロパティ、値、または状態。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。
| 値 | 説明 |
|---|---|
| HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) | そのプロパティ、値、または状態は IUIFramework::SetUICommandProperty をサポートしていません。 無効化 (invalidation) を通じてのみ設定できる場合があります。 |
| E_FAIL | 操作が失敗しました。 |
解説(Remarks)
IUIFramework::SetUICommandProperty で設定できるプロパティ キーは限られています。IUIFramework::SetUICommandProperty が HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) を返すプロパティについては、代わりに IUIFramework::InvalidateUICommand を使用してください。
特定のコントロールに対してプロパティ キーを設定する方法の詳細については、そのコントロールの Windows Ribbon Framework Control Library のページを参照してください。
Windows リボン フレームワークのコマンドのプロパティ、値、または状態を無効化します。
| commandId | DWORD | in | コマンドの ID。マークアップ リソース ファイルで指定されます。 |
| flags | UI_INVALIDATIONS | in | コマンドのどの側面を無効化するかを指定します。 メモ UI_INVALIDATIONS_ALLPROPERTIES を渡すと、値や状態を含め、コマンドにバインドされたすべてのプロパティが無効化されます。
|
| key | PROPERTYKEY* | inoptional | コマンドのプロパティまたは状態のプロパティ キー。 このパラメーターには NULL を指定できます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。
| 値 | 説明 |
|---|---|
| E_INVALIDARG | key に無効な値が指定されました。 |
| E_FAIL | 操作が失敗しました。 すべてのコマンドの無効化に失敗したか、指定されたプロパティがいずれもサポートされていません。 |
解説(Remarks)
リボン フレームワークのマークアップで定義されたリソースは、マークアップ ファイルがバイナリ形式にコンパイルされるときに作成されるリソース テーブルに格納されます。リソースはいったん無効化されると、マークアップ リソース テーブルから復元することはできません。
無効化の後、フレームワークはホスト アプリケーションにリソースの詳細を問い合わせます。
コマンドの値が無効化される場合 (flags に UI_INVALIDATIONS_VALUE が含まれる場合)、key の値は NULL になります。
IUIFramework::InvalidateUICommand が複数回呼び出され、各呼び出しで渡される UI_INVALIDATIONS の値が UI_INVALIDATIONS_STATE と UI_INVALIDATIONS_ALLPROPERTIES のように重複するプロパティを指定している場合、ホスト アプリケーションへのコールバックは 1 回だけ生成されます。
保留中のすべてのコマンド更新を処理します。
戻り値
型: HRESULT
成功した場合は S_OK を返します。それ以外の場合はエラー値を返します。
有効にするアプリケーション モードを指定します。
| iModes | INT | in | モードを識別するビット マスク。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。
解説(Remarks)
モードは、必要な機能を示すものであり、したがってアプリケーションの状態やコンテキストに応じて、実行時にどの要素を表示 (または非表示に) すべきかを示します。たとえば、ネットワーク接続はアプリケーションの機能に直接影響する可能性があり、接続が検出されたときにネットワーク関連のコマンドから成る "ネットワーク" モードが必要になることがあります。
モードはリボン マークアップ内の要素に対して指定され、実行時に個々のコントロールにバインドされます。
モードはリボンの Tab および Group に適用できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IUIFramework "{F4F0385D-6872-43A8-AD09-4C339CB3F5C5}" #usecom global IUIFramework IID_IUIFramework "{}" #comfunc global IUIFramework_Initialize 3 sptr,sptr #comfunc global IUIFramework_Destroy 4 #comfunc global IUIFramework_LoadUI 5 sptr,wstr #comfunc global IUIFramework_GetView 6 int,var,sptr #comfunc global IUIFramework_GetUICommandProperty 7 int,var,var #comfunc global IUIFramework_SetUICommandProperty 8 int,var,var #comfunc global IUIFramework_InvalidateUICommand 9 int,int,var #comfunc global IUIFramework_FlushPendingInvalidations 10 #comfunc global IUIFramework_SetModes 11 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IUIFramework "{F4F0385D-6872-43A8-AD09-4C339CB3F5C5}" #usecom global IUIFramework IID_IUIFramework "{}" #comfunc global IUIFramework_Initialize 3 sptr,sptr #comfunc global IUIFramework_Destroy 4 #comfunc global IUIFramework_LoadUI 5 sptr,wstr #comfunc global IUIFramework_GetView 6 int,sptr,sptr #comfunc global IUIFramework_GetUICommandProperty 7 int,sptr,sptr #comfunc global IUIFramework_SetUICommandProperty 8 int,sptr,sptr #comfunc global IUIFramework_InvalidateUICommand 9 int,int,sptr #comfunc global IUIFramework_FlushPendingInvalidations 10 #comfunc global IUIFramework_SetModes 11 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。