Win32 API 日本語リファレンス
ホームUI.Ribbon › IUIFramework

IUIFramework

COM
IIDf4f0385d-6872-43a8-ad09-4c339cb3f5c5継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IUIFramework インターフェイスは Windows リボン フレームワークによって実装され、フレームワークの中核機能を提供するメソッドを定義します。

解説(Remarks)

このインターフェイスは、リボン フレームワークの初期化と破棄に使用します。

リボン フレームワークの UI 機能は View によって区別されます。View とは、本質的には RibbonContextPopup といった、組み込みのコア コントロールです。

IUIFramework の実装へのインターフェイス ポインターを取得するには、CoCreateInstance を使用して、クラス識別子 (CLSID) が CLSID_UIRibbonFramework の COM オブジェクトを作成します。

メソッド 9

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Initialize(HWND frameWnd, IUIApplication* application)

ホスト アプリケーションを Windows リボン フレームワークに接続します。

frameWndHWNDinリボンを格納するトップレベル ウィンドウへのハンドル。
applicationIUIApplication*inホスト アプリケーションの IUIApplication 実装へのポインター。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。

説明
HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) frameWndNULL であるか、既存のウィンドウを指していないか、デスクトップのトップレベル ウィンドウではありません。
メモ このエラーは、frameWnd が子ウィンドウ (WS_CHILD) である場合、ツール ウィンドウ (WS_EX_TOOLWINDOW) として宣言されている場合、またはキャプション プロパティを持たない場合 (WS_CAPTION は必須) にも返されます。
HRESULT_FROM_WIN32(ERROR_WINDOW_OF_OTHER_THREAD) frameWnd が実行スレッドによって所有されていません。
E_POINTER applicationNULL であるか、無効なポインターです。

解説(Remarks)

このメソッドは、リボンを必要とするトップレベル ウィンドウごとに、ホスト アプリケーションから呼び出す必要があります。

このメソッドは、リボン フレームワークがホスト アプリケーション内のコールバックを呼び出せるようにするためのフックを設定するために使用されます。

リボンを正しく初期化するには、コンパイル済みのリボン マークアップ ファイルがリソースとして利用可能であり、後続の IUIFramework::LoadUI の呼び出しで指定される必要があります。このマークアップ ファイルはフレームワークに不可欠な構成要素であり、使用するコントロールとそのレイアウトを指定します。

IUIFramework::Initialize が成功した場合:

次の例は、基本的なフレームワーク初期化関数を示しています。

//
//  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;
}
vtbl 4 HRESULT Destroy()

Windows リボン フレームワークのインスタンスに関するすべてのオブジェクト、フック、参照を終了して解放します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。

解説(Remarks)

このメソッドは、IUIFramework のインスタンスごとに 1 回呼び出す必要があります。

IUIFramework::Initialize を呼び出した場合は、リソースを解放してフレームワークを適切に破棄するために、IUIFramework::Destroy を呼び出す必要があります。IUIFramework::Destroy を呼び出さないと、メモリ リークが発生する可能性があります。

vtbl 5 HRESULT LoadUI(HINSTANCE instance, LPWSTR resourceName)

Windows リボン フレームワークの UI リソース ファイル (コンパイル済みマークアップ) を読み込みます。

instanceHINSTANCEinリボン アプリケーション インスタンスへのハンドル。
resourceNameLPWSTRin

コンパイル済みのバイナリ マークアップを含むリソースの名前。

メモ リボンを正しく初期化するには、コンパイル済みのリボン マークアップ ファイルがリソースとして利用可能である必要があります。このマークアップ ファイルはリボン フレームワークに不可欠な構成要素であり、使用するコントロールとそのレイアウトを指定します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。

解説(Remarks)

IUIFramework::LoadUI は初期化時に呼び出す必要があります。このメソッドは、間に IUIFramework::Destroy の呼び出しを挟むことを条件として、アプリケーションのライフサイクル中に複数回呼び出すことができます (たとえば、リボンの表示や非表示を切り替える場合)。

OnCreateUICommandOnViewChanged は、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;
}
vtbl 6 HRESULT GetView(DWORD viewId, GUID* riid, void** ppv)

IUIRibbon や IUIContextualUI など、Windows リボン フレームワークの View を表すインターフェイスへのポインターのアドレスを取得します。

viewIdDWORDinView の ID。 Ribbon の場合は値 0、ContextPopup の場合はその Command.Id を指定します。
riidGUID*inIUIRibbon または IUIContextualUI のインターフェイス ID。
ppvvoid**outこのメソッドが返るとき、IUIRibbon オブジェクトまたは IUIContextualUI オブジェクトへのポインターのアドレスが格納されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。

説明
E_INVALIDARG riid が有効なインターフェイス ID ではありません。
E_FAIL 操作が失敗しました。

解説(Remarks)

リボン フレームワークの UI 機能は View によって区別されます。View とは、本質的には RibbonContextPopup といった、組み込みのコア フレームワークです。

アプリケーションの存続期間を通じてインターフェイスへのポインターを保持するのではなく、IUIFramework::GetView を使用することで、ホスト アプリケーションは一時的なインターフェイス ポインターを作成し、必要に応じてメソッドを呼び出すことができます。

メモ メモリ リークを避けるため、ホスト アプリケーションは一時的なインターフェイス ポインターに対して IUnknown::Release を呼び出す必要があります。
たとえば、リボンのサイズが変更されるたびに、ホスト アプリケーションは GetHeight を呼び出して、ホストのクライアント領域のサイズを適切に調整します。

次の例は、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;
    }
  }
}
vtbl 7 HRESULT GetUICommandProperty(DWORD commandId, PROPERTYKEY* key, PROPVARIANT* value)

コマンドのプロパティ、値、または状態を取得します。

commandIdDWORDinコマンドの ID。マークアップ リソース ファイルで指定されます。
keyPROPERTYKEY*inコマンドのプロパティ、値、または状態のプロパティ キー。
valuePROPVARIANT*outこのメソッドが返るとき、プロパティ、値、または状態が格納されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。

説明
HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) そのプロパティ、値、または状態は IUIFramework::GetUICommandProperty をサポートしていません。
            </td>
E_FAIL 操作が失敗しました。
vtbl 8 HRESULT SetUICommandProperty(DWORD commandId, PROPERTYKEY* key, PROPVARIANT* value)

コマンドのプロパティ、値、または状態を設定します。

commandIdDWORDinコマンドの ID。マークアップ リソース ファイルで指定されます。
keyPROPERTYKEY*inコマンドのプロパティ、値、または状態のプロパティ キー。
valuePROPVARIANT*inプロパティ、値、または状態。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。

説明
HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) そのプロパティ、値、または状態は IUIFramework::SetUICommandProperty をサポートしていません。 無効化 (invalidation) を通じてのみ設定できる場合があります。
E_FAIL 操作が失敗しました。

解説(Remarks)

IUIFramework::SetUICommandProperty で設定できるプロパティ キーは限られています。IUIFramework::SetUICommandPropertyHRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) を返すプロパティについては、代わりに IUIFramework::InvalidateUICommand を使用してください。

特定のコントロールに対してプロパティ キーを設定する方法の詳細については、そのコントロールの Windows Ribbon Framework Control Library のページを参照してください。

vtbl 9 HRESULT InvalidateUICommand(DWORD commandId, UI_INVALIDATIONS flags, PROPERTYKEY* key)

Windows リボン フレームワークのコマンドのプロパティ、値、または状態を無効化します。

commandIdDWORDinコマンドの ID。マークアップ リソース ファイルで指定されます。
flagsUI_INVALIDATIONSin

コマンドのどの側面を無効化するかを指定します。

メモ UI_INVALIDATIONS_ALLPROPERTIES を渡すと、値や状態を含め、コマンドにバインドされたすべてのプロパティが無効化されます。
keyPROPERTYKEY*inoptionalコマンドのプロパティまたは状態のプロパティ キー。 このパラメーターには NULL を指定できます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次の一覧のエラー値を返します。

説明
E_INVALIDARG key に無効な値が指定されました。
E_FAIL 操作が失敗しました。 すべてのコマンドの無効化に失敗したか、指定されたプロパティがいずれもサポートされていません。

解説(Remarks)

リボン フレームワークのマークアップで定義されたリソースは、マークアップ ファイルがバイナリ形式にコンパイルされるときに作成されるリソース テーブルに格納されます。リソースはいったん無効化されると、マークアップ リソース テーブルから復元することはできません。

無効化の後、フレームワークはホスト アプリケーションにリソースの詳細を問い合わせます。

コマンドの値が無効化される場合 (flagsUI_INVALIDATIONS_VALUE が含まれる場合)、key の値は NULL になります。

IUIFramework::InvalidateUICommand が複数回呼び出され、各呼び出しで渡される UI_INVALIDATIONS の値が UI_INVALIDATIONS_STATEUI_INVALIDATIONS_ALLPROPERTIES のように重複するプロパティを指定している場合、ホスト アプリケーションへのコールバックは 1 回だけ生成されます。

vtbl 10 HRESULT FlushPendingInvalidations()

保留中のすべてのコマンド更新を処理します。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合はエラー値を返します。

vtbl 11 HRESULT SetModes(INT iModes)

有効にするアプリケーション モードを指定します。

iModesINTinモードを識別するビット マスク。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。

解説(Remarks)

モードは、必要な機能を示すものであり、したがってアプリケーションの状態やコンテキストに応じて、実行時にどの要素を表示 (または非表示に) すべきかを示します。たとえば、ネットワーク接続はアプリケーションの機能に直接影響する可能性があり、接続が検出されたときにネットワーク関連のコマンドから成る "ネットワーク" モードが必要になることがあります。

モードはリボン マークアップ内の要素に対して指定され、実行時に個々のコントロールにバインドされます。

モードはリボンの Tab および Group に適用できます。

メモ ButtonSplitButtonDropDownButton の各コントロールがアプリケーション メニューの左列にホストされている場合、それらにモードを適用できます。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。