IOleInPlaceObject
COM公式ドキュメント
インプレースオブジェクトのアクティブ化と非アクティブ化を管理し、インプレースオブジェクトのどの範囲を表示すべきかを決定します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
アクティブなインプレースオブジェクトを非アクティブ化し、そのオブジェクトの元に戻す (undo) 状態を破棄します。
戻り値
このメソッドは、成功すると S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| 予期しないエラーが発生しました。 |
解説(Remarks)
呼び出し側への注意
このメソッドは、アクティブなオブジェクトを非アクティブ化してその元に戻す状態を破棄するために、アクティブなオブジェクトの直接のコンテナーから呼び出されます。実装側への注意
IOleInPlaceObject::InPlaceDeactivate から戻る際に、オブジェクトは元に戻す状態を破棄します。オブジェクトアプリケーションは、この呼び出しの直後にシャットダウンすべきではありません。代わりに、IOleObject::Close が明示的に呼び出されるか、オブジェクトの参照カウントがゼロに達するまで待機する必要があります。非アクティブ化する前に、オブジェクトアプリケーションは IOleInPlaceSite::OnUIDeactivate を呼び出して、コンテナーが自身のユーザーインターフェイスをフレームウィンドウに戻す機会を与える必要があります。
IOleInPlaceObject::InPlaceDeactivate の呼び出し中にインプレースのユーザーインターフェイスがまだ表示されている場合、オブジェクトアプリケーションは自身の IOleInPlaceObject::InPlaceDeactivate メソッドを呼び出してユーザーインターフェイスを非表示にする必要があります。インプレースのユーザーインターフェイスは、IOleInPlaceObject::InPlaceDeactivate の呼び出し中に破棄することもできます。ただし、コンテナーが IOleObject::Close を呼び出した時点でユーザーインターフェイスがまだ破棄されていない場合は、IOleObject::Close の呼び出し中に破棄する必要があります。
IOleObject::Close の呼び出し中に、オブジェクトはまだインプレースでアクティブかどうかを確認する必要があります。アクティブである場合は、IOleInPlaceObject::InPlaceDeactivate を呼び出す必要があります。
アクティブなインプレースオブジェクトのユーザーインターフェイスを非アクティブ化して削除します。
戻り値
このメソッドは、成功すると S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| 予期しないエラーが発生しました。 |
解説(Remarks)
呼び出し側への注意
このメソッドは、たとえばユーザーがオブジェクトの外側のクライアント領域をクリックした場合などに、オブジェクトの直接のコンテナーから呼び出されます。コンテナーが IOleInPlaceObject::UIDeactivate を呼び出した場合は、後で IOleInPlaceObject::InPlaceDeactivate を呼び出してリソースを適切にクリーンアップする必要があります。コンテナーは、必要に応じてオブジェクトを停止または解放することでリソースがクリーンアップされると想定できます。IOleInPlaceObject::InPlaceDeactivate が呼び出されていないものの、IOleInPlaceObject::UIDeactivate または IOleObject::Close のいずれかが呼び出された場合、オブジェクトはリソースをクリーンアップできるように備えておく必要があります。
実装側への注意
メニューやウィンドウなどのリソースは、IOleInPlaceObject::InPlaceDeactivate または IOleObject::Close のいずれかの呼び出しによってオブジェクトが完全に非アクティブ化されるまで、クリーンアップするか、非表示の状態で保持することができます。オブジェクトアプリケーションは、複合メニューに対して何らかの操作を行う前に IOleInPlaceSite::OnUIDeactivate を呼び出し、コンテナーを先にフレームウィンドウから切り離せるようにする必要があります。インプレースオブジェクトのユーザーインターフェイスを非アクティブ化すると、オブジェクトはすばやく再アクティブ化できるレディ状態のままになります。オブジェクトは、ドキュメントの元に戻す状態が変化するまでこの状態を維持します。その後、コンテナーは IOleInPlaceObject::InPlaceDeactivate を呼び出して、元に戻す状態を破棄するようオブジェクトに指示する必要があります。インプレースオブジェクトのどの範囲を表示するかを指定します。
| lprcPosRect | RECT* | in | インプレースオブジェクトの位置を、その親ウィンドウのクライアント座標で格納した RECT 構造体へのポインター。 |
| lprcClipRect | RECT* | in | インプレースオブジェクトの位置矩形 (lprcPosRect) を包含する外側の矩形へのポインター。この矩形は、オブジェクトの親ウィンドウのクライアント領域を基準とします。 |
戻り値
このメソッドは、成功すると S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| 指定されたポインターが無効です。 | |
| 操作に使用できるメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
lprcPosRect が変化せずに lprcClipRect が変化することもあります。
インプレースオブジェクトの矩形のサイズは、常にピクセル単位で計算されます。これは、HIMETRIC 単位で表される他の OLE オブジェクトの表示とは異なります。
呼び出し側への注意
コンテナーは、インプレースオブジェクトのウィンドウ位置やインプレースオブジェクトの可視部分が変化するたびに、IOleInPlaceObject::SetObjectRects を呼び出す必要があります。実装側への注意
オブジェクトは、lprcPosRect と lprcClipRect の交差部分に一致するように、自身のインプレースウィンドウのサイズを設定する必要があります。また、適切なクリッピングが行われるように、オブジェクトの内容をオブジェクトのインプレースウィンドウに描画する必要があります。オブジェクトは、自身の幅と高さを、コンテナーから提供された値 (lprcPosRect を通じて伝えられます) と比較する必要があります。比較が一致しない場合、コンテナーはオブジェクトにスケーリングを適用しています。その場合、オブジェクトはスケール/ズームモードでインプレース編集を続行するか、非アクティブ化するかを判断する必要があります。
以前に非アクティブ化されたオブジェクトを再アクティブ化し、そのオブジェクトの最後の状態を元に戻します。
戻り値
このメソッドは、成功すると S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
|
元に戻す状態が利用できません。 |
| 操作に使用できるメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
オブジェクトの元に戻す状態が失われる前にユーザーが元に戻すコマンドを選択した場合、オブジェクトの直接のコンテナーは IOleInPlaceObject::ReactivateAndUndo を呼び出して、ユーザーインターフェイスをアクティブ化し、元に戻す操作を実行し、オブジェクトをアクティブな状態に戻します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleInPlaceObject "{00000113-0000-0000-C000-000000000046}" #usecom global IOleInPlaceObject IID_IOleInPlaceObject "{}" #comfunc global IOleInPlaceObject_InPlaceDeactivate 5 #comfunc global IOleInPlaceObject_UIDeactivate 6 #comfunc global IOleInPlaceObject_SetObjectRects 7 var,var #comfunc global IOleInPlaceObject_ReactivateAndUndo 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IOleInPlaceObject "{00000113-0000-0000-C000-000000000046}" #usecom global IOleInPlaceObject IID_IOleInPlaceObject "{}" #comfunc global IOleInPlaceObject_InPlaceDeactivate 5 #comfunc global IOleInPlaceObject_UIDeactivate 6 #comfunc global IOleInPlaceObject_SetObjectRects 7 sptr,sptr #comfunc global IOleInPlaceObject_ReactivateAndUndo 8 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。