IOleInPlaceActiveObject
COM公式ドキュメント
インプレースオブジェクトと、それに関連付けられたアプリケーションの最も外側のフレームウィンドウ、およびその埋め込みオブジェクトを含むアプリケーション内のドキュメントウィンドウとの間で、直接的な通信チャネルを提供します。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コンテナのメッセージキューからメニューアクセラレータキーのメッセージを処理します。このメソッドは、DLL オブジェクトアプリケーションによって作成されたオブジェクトに対してのみ使用してください。
| lpmsg | MSG* | inoptional | 変換が必要になる可能性のあるメッセージを表す MSG 構造体へのポインタ。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| メッセージは変換されませんでした。 | |
| 指定されたパラメータの値が無効です。 | |
| 操作に利用できるメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
呼び出し側への注意
アクティブなインプレースオブジェクトには、常にアクセラレータキーストロークを変換する最初の機会を与える必要があります。この機会を提供するには、他の変換を行う前に、コンテナのメッセージループから IOleInPlaceActiveObject::TranslateAccelerator を呼び出します。独自の変換は、このメソッドが S_FALSE を返した場合にのみ適用してください。DLL オブジェクトアプリケーションによって作成されていないオブジェクトに対して IOleInPlaceActiveObject::TranslateAccelerator を呼び出した場合、既定のオブジェクトハンドラは S_FALSE を返します。
実装者への注意
EXE オブジェクトアプリケーションによって作成されたオブジェクトは、自身のメッセージポンプからキーストロークを取得するため、コンテナはそれらのメッセージを受け取りません。このメソッドを実装する必要がある場合は、TranslateAccelerator 関数への呼び出しを単純にラップするだけで実装できます。
コンテナの最上位フレームウィンドウがアクティブ化または非アクティブ化されたときに、オブジェクトへ通知します。
| fActivate | BOOL | in | コンテナの最上位フレームウィンドウの状態。このパラメータは、ウィンドウがアクティブ化される場合は TRUE、非アクティブ化される場合は FALSE です。 |
戻り値
このメソッドは成功時に S_OK を返します。
コンテナのドキュメントウィンドウがアクティブ化または非アクティブ化されたときに、アクティブなインプレースオブジェクトへ通知します。
| fActivate | BOOL | in | MDI 子ドキュメントウィンドウの状態。このパラメータが TRUE の場合、ウィンドウはアクティブ化の処理中であり、FALSE の場合は非アクティブ化の処理中です。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
呼び出し側への注意
MDI 子ドキュメントウィンドウがアクティブ化または非アクティブ化され、かつオブジェクトが現在そのドキュメントのアクティブオブジェクトである場合に、IOleInPlaceActiveObject::OnDocWindowActivate を呼び出します。実装者への注意
このメソッドには、オブジェクトのアクティブ化中にフレームレベルのツールをインストールするコードを含める必要があります。これらのツールには、共有される複合メニューや、オプションのツールバーおよびフレーム装飾が含まれます。その後、フォーカスを取得してください。非アクティブ化の際には、オブジェクトはフレームレベルのツールを削除する必要があります。なお、pborderwidths を NULL に設定して IOleInPlaceUIWindow::SetBorderSpace を呼び出さなければ、境界スペースの再交渉を避けることができます。IOleInPlaceActiveObject::OnDocWindowActivate の実行中は、PeekMessage 関数や GetMessage 関数、あるいはダイアログボックスを呼び出さないでください。これを行うと、システムがデッドロックする可能性があります。IOleInPlaceActiveObject::OnDocWindowActivate 内から呼び出せる OLE インターフェイスのメソッドおよび関数には、さらに制限があります。
オブジェクトに、その境界スペースのサイズ変更が必要であることを通知します。
| prcBorder | RECT* | in | オブジェクトがそのツール用に境界スペースを要求できる、新しい外側の矩形を含む RECT 構造体へのポインタ。 |
| pUIWindow | IOleInPlaceUIWindow* | in | 境界が変更されたフレームウィンドウまたはドキュメントウィンドウオブジェクトの IOleInPlaceUIWindow インターフェイスポインタへのポインタ。 |
| fFrameWindow | BOOL | in | このパラメータは、フレームウィンドウオブジェクトが IOleInPlaceActiveObject::ResizeBorder を呼び出している場合は TRUE、それ以外の場合は FALSE です。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| 指定されたパラメータの値が無効です。 | |
| 操作に利用できるメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
呼び出し側への注意
IOleInPlaceActiveObject::ResizeBorder は、オブジェクトに割り当てられた境界スペースを変更すべきときに、最上位コンテナのドキュメントウィンドウまたはフレームウィンドウオブジェクトによって呼び出されます。アクティブなインプレースオブジェクトは、どのウィンドウ(フレームレベルまたはドキュメントレベルのウィンドウ)が変更されたかを通知されないため、IOleInPlaceActiveObject::ResizeBorder には、そのウィンドウの IOleInPlaceUIWindow インターフェイスへのポインタを渡す必要があります。実装者への注意
ほとんどの場合、サイズ変更には、オブジェクトのフレーム装飾を拡大、縮小、またはスケーリングするだけで済みます。ただし、より複雑な装飾の場合は、IOleInPlaceUIWindow::SetBorderSpace および IOleInPlaceUIWindow::SetBorderSpace の呼び出しによって境界スペースを再交渉する必要が生じることがあります。コンテナがモーダルダイアログボックスを作成または破棄する際に、モードレスダイアログボックスを有効または無効にします。
| fEnable | BOOL | in | モードレスダイアログボックスウィンドウを有効にする(TRUE)か、無効にする(FALSE)かを示します。 |
戻り値
このメソッドは成功時に S_OK を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleInPlaceActiveObject "{00000117-0000-0000-C000-000000000046}" #usecom global IOleInPlaceActiveObject IID_IOleInPlaceActiveObject "{}" #comfunc global IOleInPlaceActiveObject_TranslateAccelerator 5 var #comfunc global IOleInPlaceActiveObject_OnFrameWindowActivate 6 int #comfunc global IOleInPlaceActiveObject_OnDocWindowActivate 7 int #comfunc global IOleInPlaceActiveObject_ResizeBorder 8 var,sptr,int #comfunc global IOleInPlaceActiveObject_EnableModeless 9 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IOleInPlaceActiveObject "{00000117-0000-0000-C000-000000000046}" #usecom global IOleInPlaceActiveObject IID_IOleInPlaceActiveObject "{}" #comfunc global IOleInPlaceActiveObject_TranslateAccelerator 5 sptr #comfunc global IOleInPlaceActiveObject_OnFrameWindowActivate 6 int #comfunc global IOleInPlaceActiveObject_OnDocWindowActivate 7 int #comfunc global IOleInPlaceActiveObject_ResizeBorder 8 sptr,sptr,int #comfunc global IOleInPlaceActiveObject_EnableModeless 9 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。