Win32 API 日本語リファレンス
ホームSystem.Ole › IOleWindow

IOleWindow

COM
IID00000114-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IOleWindow インターフェイスは、インプレースアクティベーションに関与するさまざまなウィンドウのハンドルを取得したり、コンテキスト依存ヘルプモードの開始・終了を行ったりするためのメソッドをアプリケーションに提供します。

解説(Remarks)

いくつかの他のインプレースアクティベーションインターフェイスは、IOleWindow インターフェイスから派生しています。コンテナーとオブジェクトは、インプレースアクティベーションをサポートするために、これらのインターフェイスを実装して使用する必要があります。次の表は、これらの各インターフェイスを簡潔にまとめたものです。

インターフェイス 説明
IOleWindow 基底となるインターフェイスです。ウィンドウハンドルの取得やコンテキスト依存ヘルプの管理を行うために、コンテナーとオブジェクトによって実装・使用されます。このインターフェイスはマシン境界をまたぐ使用はサポートされていません。
IOleInPlaceObject オブジェクトによって実装され、オブジェクトの直接のコンテナーがオブジェクトのアクティブ化・非アクティブ化を行うために使用します。
IOleInPlaceActiveObject オブジェクトによって実装され、最上位コンテナーがアクティブなオブジェクトを操作するために使用します。アクティブなオブジェクトと、そのフレームウィンドウおよびドキュメントウィンドウとの間の直接的な通信経路を提供します。
IOleInPlaceUIWindow コンテナーによって実装され、オブジェクトがコンテナーのドキュメントウィンドウを操作するために使用します。
IOleInPlaceFrame コンテナーによって実装され、オブジェクトがコンテナーのフレームウィンドウを制御するために使用します。
IOleInPlaceSite コンテナーによって実装され、オブジェクトがインプレースクライアントサイトと対話するために使用します。
IOleInPlaceSiteEx コンテナーによって実装され、オブジェクトがアクティブ化・非アクティブ化を最適化するために呼び出します。
IOleInPlaceSiteWindowless コンテナーによって実装され、ウィンドウレスオブジェクトがコンテナーからサービスを取得するために呼び出します。
IOleInPlaceObjectWindowless ウィンドウレスオブジェクトによって実装され、ウィンドウレスオブジェクトのウィンドウメッセージ処理およびドラッグアンドドロップ操作をサポートするためにコンテナーによって呼び出されます。

これらのインターフェイスは、各レベルでさまざまなインターフェイスが実装される3つの階層レベルに配置できます。ユーザーインターフェイスのメニューコマンドやフレーム装飾のインストール、ウィンドウのアクティブ化と切り替え、メニューやキーストロークのディスパッチを行う呼び出しは、最上位コンテナーとアクティブなオブジェクトとの間で行われます。アクティブ化、非アクティブ化、スクロール、クリッピングをサポートする呼び出しは、封じ込め階層全体にまたがり、各レベルが適切な処理を実行します。

メソッド 2

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

vtbl 3 HRESULT GetWindow(HWND* phwnd)

インプレースアクティベーションに関与するウィンドウ(フレーム、ドキュメント、親、またはインプレースオブジェクトのウィンドウ)のいずれかのハンドルを取得します。

phwndHWND*outウィンドウハンドルを受け取る変数へのポインター。

戻り値

このメソッドは成功時に S_OK を返します。その他に返される可能性のある値には次のものがあります。

戻り値 説明
E_FAIL
オブジェクトがウィンドウレスです。
E_INVALIDARG
指定された fEnterMode の値が無効です。
E_OUTOFMEMORY
この操作に利用できるメモリが不足しています。
E_UNEXPECTED
予期しないエラーが発生しました。

解説(Remarks)

ウィンドウ階層は5種類のウィンドウで構成されます。オブジェクトがインプレースでアクティブなとき、これらのウィンドウの一部またはすべてにアクセスできます。

ウィンドウ 説明
フレーム コンテナーアプリケーションのメインメニューが配置される、最も外側のメインウィンドウです。
ドキュメント 埋め込みオブジェクトを含む複合ドキュメントをユーザーに表示するウィンドウです。
ペイン オブジェクトのビューを含むドキュメントウィンドウのサブウィンドウです。ペイン分割ウィンドウを持つアプリケーションにのみ適用されます。
オブジェクトのビューを含むコンテナーウィンドウです。オブジェクトアプリケーションは、自身のウィンドウをこのウィンドウの子としてインストールします。
インプレース アクティブなインプレースオブジェクトを含むウィンドウです。オブジェクトアプリケーションはこのウィンドウを作成し、自身のハッチウィンドウの子としてインストールします。ハッチウィンドウはコンテナーの親ウィンドウの子です。

各種類のウィンドウは、インプレースアクティベーションアーキテクチャにおいて異なる役割を担います。ただし、種類ごとに個別の物理ウィンドウを用いる必要はありません。多くのコンテナーアプリケーションは、フレーム、ドキュメント、ペイン、親の各ウィンドウに同一のウィンドウを使用します。

vtbl 4 HRESULT ContextSensitiveHelp(BOOL fEnterMode)

インプレースアクティベーションセッション中にコンテキスト依存ヘルプモードに入るべきかどうかを決定します。

fEnterModeBOOLinヘルプモードに入る場合は TRUE、終了する場合は FALSE

戻り値

このメソッドは、fEnterMode に渡された値に応じてヘルプモードの開始または終了に成功した場合に S_OK を返します。その他に返される可能性のある値には次のものがあります。

戻り値 説明
E_INVALIDARG
指定された fEnterMode の値が無効です。
E_OUTOFMEMORY
この操作に利用できるメモリが不足しています。
E_UNEXPECTED
予期しないエラーが発生しました。

解説(Remarks)

アプリケーションは、次のユーザー操作時にコンテキスト依存ヘルプを呼び出すことができます。

SHIFT+F1 が押されると、フレームまたはアクティブなオブジェクトのいずれかがそのキーストロークを受け取ります。コンテナーのフレームがキーストロークを受け取った場合、それを含むドキュメントの IOleWindow::ContextSensitiveHelp メソッドを fEnterModeTRUE に設定して呼び出します。これにより、ヘルプ状態がすべてのインプレースオブジェクトに伝播され、マウスクリックや WM_COMMAND を正しく処理できるようになります。

アクティブなオブジェクトが SHIFT+F1 のキーストロークを受け取った場合、コンテナーの IOleWindow::ContextSensitiveHelp メソッドを fEnterMode TRUE で呼び出します。コンテナーは、通知すべきインプレースサイトがなくなるまで、各インプレースサイトを再帰的に呼び出します。その後、コンテナーは自身のドキュメントまたはフレームの IOleWindow::ContextSensitiveHelp メソッドを fEnterMode TRUE で呼び出します。

コンテキスト依存ヘルプモードのとき、マウスクリックを受け取ったオブジェクトは次のいずれかを行えます。

コンテキスト依存ヘルプモードのオブジェクトが WM_COMMAND を受け取った場合は、他のすべてのインプレースオブジェクトにコンテキスト依存ヘルプモードを終了するよう指示し、そのコマンドに対するヘルプを提供する必要があります。

コンテナーアプリケーションがメニュー項目に対するコンテキスト依存ヘルプをサポートする場合は、F1 キーを傍受できるように独自のメッセージフィルターを提供するか、OleSetMenuDescriptor を呼び出して OLE ライブラリにメッセージフィルターの追加を依頼する必要があります。その際、lpFrame および lpActiveObj パラメーターに有効かつ非 NULL の値を渡します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IOleWindow "{00000114-0000-0000-C000-000000000046}"
#usecom global IOleWindow IID_IOleWindow "{}"
#comfunc global IOleWindow_GetWindow             3 sptr
#comfunc global IOleWindow_ContextSensitiveHelp  4 int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。