IOleInPlaceObjectWindowless
COM公式ドキュメント
ウィンドウレスオブジェクトがウィンドウメッセージを処理し、ドラッグアンドドロップ操作に参加できるようにします。IOleInPlaceObject インターフェイスから派生し、それを拡張したものです。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コンテナーから、インプレースアクティブなウィンドウレスオブジェクトへメッセージをディスパッチします。
| msg | DWORD | in | Windows からコンテナーに提供されるウィンドウメッセージの識別子。 |
| wParam | WPARAM | in | Windows からコンテナーに提供されるウィンドウメッセージのパラメーター。 |
| lParam | LPARAM | in | Windows からコンテナーに提供されるウィンドウメッセージのパラメーター。 |
| plResult | LRESULT* | out | ウィンドウメッセージの結果コードへのポインター。 |
戻り値
成功した場合、このメソッドは S_OK を返します。その他の戻り値には次のものがあります。
| Return code | Description |
|---|---|
| ウィンドウレスオブジェクトはウィンドウメッセージを処理しませんでした。コンテナーは、このメッセージに対して DefWindowProc を呼び出すか、後述のようにメッセージ自体を処理する必要があります。 |
解説(Remarks)
コンテナーは、インプレースアクティブなウィンドウレスオブジェクトへウィンドウメッセージを送信するためにこのメソッドを呼び出します。コンテナーは、次のガイドラインに従ってメッセージをディスパッチする必要があります。
次のメッセージについては、コンテナーはまず、マウスをキャプチャしているウィンドウレスオブジェクトがあればそこへメッセージをディスパッチします。それ以外の場合、コンテナーはマウスカーソルの下にあるウィンドウレスオブジェクトへメッセージをディスパッチします。該当するオブジェクトがない場合、コンテナーは次のメッセージを自身で処理してかまいません。
次のメッセージについては、コンテナーはキーボードフォーカスを持つウィンドウレスオブジェクトへメッセージをディスパッチする必要があります。- WM_CANCELMODE
- WM_CHAR
- WM_DEADCHAR
- WM_HELP
- WM_IMExxx
- WM_KEYDOWN
- WM_KEYUP
- WM_SYSDEADCHAR
- WM_SYSKEYDOWN
- WM_SYSKEYUP
ウィンドウレスオブジェクトは、メッセージを処理しなかったことを示すために、このメソッドに対して S_FALSE を返すことができます。その場合、コンテナーは DefWindowProc 関数を呼び出してメッセージの既定の動作を実行するか、メッセージ自体を処理します。
コンテナーは、次のウィンドウメッセージを既定のウィンドウプロシージャに渡す必要があります。
- WM_CHAR
- WM_DEADCHAR
- WM_IMExxx
- WM_KEYDOWN
- WM_KEYUP
- WM_MOUSEMOVE
- WM_SYSCHAR
- WM_SYSDEADCHAR
- WM_SYSKEYUP
- WM_XBUTTONDOWN
- WM_XBUTTONUP
- WM_XBUTTONDBLCLK
wParam および lParam でオブジェクトに渡されるすべての座標は、含んでいるウィンドウのクライアント座標として指定されます。
ドラッグアンドドロップをサポートする、インプレースアクティブなウィンドウレスオブジェクトの IDropTarget インターフェイスを取得します。
| ppDropTarget | IDropTarget** | out | ウィンドウレスオブジェクトへのインターフェイスポインターを受け取る IDropTarget ポインター変数へのポインター。 |
戻り値
成功した場合、このメソッドは S_OK を返します。その他の戻り値には次のものがあります。
| Return code | Description |
|---|---|
| ウィンドウレスオブジェクトはドラッグアンドドロップをサポートしていません。 |
解説(Remarks)
ウィンドウを持つオブジェクトは、RegisterDragDrop 関数を呼び出し、そのウィンドウハンドルをパラメーターとして指定することで、自身の IDropTarget インターフェイスを登録します。IDropTarget インターフェイスを登録することで、オブジェクトはドラッグアンドドロップ操作に参加できるようになります。ウィンドウレスオブジェクトは、アクティブなときにウィンドウを持たないため、自身の IDropTarget インターフェイスを登録できません。したがって、コンテナーからのサポートなしには、ドラッグアンドドロップ操作に直接参加することはできません。
ウィンドウレスオブジェクトが関与するドラッグアンドドロップ操作では、次のイベントが発生します。
- コンテナーは、RegisterDragDrop 関数を通じて、自身の IDropTarget インターフェイスを登録します。
- コンテナーは、自身の IDropTarget::DragEnter メソッドまたは IDropTarget::DragOver メソッドの実装内で、マウスポインターが埋め込みオブジェクトに入ったばかりかどうかを検出します。
- オブジェクトが非アクティブな場合、コンテナーはオブジェクトの IPointerInactive::GetActivationPolicy メソッドを呼び出します。オブジェクトは POINTERINACTIVE_ACTIVATEONDRAG フラグを返します。コンテナーはその後、オブジェクトをインプレースでアクティブ化します。オブジェクトが既にアクティブであった場合、コンテナーはこの手順を行う必要はありません。
- オブジェクトがアクティブになった後、コンテナーはオブジェクトの IDropTarget インターフェイスを取得する必要があります。
- ドロップターゲットになろうとするウィンドウレスオブジェクトは、依然として IDropTarget インターフェイスを実装しますが、それを登録せず、IUnknown::QueryInterface の呼び出しを通じて返すこともしません。代わりに、コンテナーはオブジェクトの IOleInPlaceObjectWindowless::GetDropTarget メソッドを呼び出すことで、このインターフェイスを取得できます。オブジェクトは、ドラッグアンドドロップ操作に参加したい場合、自身の IDropTarget インターフェイスへのポインターを返します。コンテナーは、後で使用するためにこのインターフェイスポインターをキャッシュできます。たとえば、コンテナーの IDropTarget::DragEnter メソッドまたは IDropTarget::DragLeave メソッドの後続の呼び出しでは、オブジェクトの GetDropTarget メソッドを再度呼び出す代わりに、キャッシュしたポインターを使用できます。
- コンテナーはその後、オブジェクトの IDropTarget::DragEnter を呼び出し、自身の IDropTarget::DragOver メソッドまたは IDropTarget::DragEnter メソッドから返された pdwEffect の値を渡します。この時点以降、コンテナーは、マウスがオブジェクトから離れるか、オブジェクト上でドロップが発生するまで、後続のすべての IDropTarget::DragOver 呼び出しをウィンドウレスオブジェクトへ転送します。マウスがオブジェクトから離れた場合、コンテナーはオブジェクトの IDropTarget::DragLeave を呼び出し、その後オブジェクトの IDropTarget インターフェイスを解放します。ドロップが発生した場合、コンテナーは IDropTarget::Drop 呼び出しをオブジェクトへ転送します。
- 最後に、コンテナーはオブジェクトをインプレースで非アクティブ化します。
IDropTarget::DragEnter から S_FALSE を返すオブジェクトは、間に IDropTarget::DragLeave を挟まずに後続の IDropTarget::DragEnter 呼び出しを受け取る可能性に備える必要があります。実際、コンテナーの次の IDropTarget::DragOver 呼び出し時にマウスが依然として同じオブジェクトの上にある場合、コンテナーはそのオブジェクトに対して再度 IDropTarget::DragEnter を呼び出そうとすることがあります。
呼び出し元への注意
コンテナーは、後で使用するためにオブジェクトの IDropTarget インターフェイスへのポインターをキャッシュできます。Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleInPlaceObjectWindowless "{1C2056CC-5EF4-101B-8BC8-00AA003E3B29}" #usecom global IOleInPlaceObjectWindowless IID_IOleInPlaceObjectWindowless "{}" #comfunc global IOleInPlaceObjectWindowless_OnWindowMessage 9 int,sptr,sptr,var #comfunc global IOleInPlaceObjectWindowless_GetDropTarget 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IOleInPlaceObjectWindowless "{1C2056CC-5EF4-101B-8BC8-00AA003E3B29}" #usecom global IOleInPlaceObjectWindowless IID_IOleInPlaceObjectWindowless "{}" #comfunc global IOleInPlaceObjectWindowless_OnWindowMessage 9 int,sptr,sptr,sptr #comfunc global IOleInPlaceObjectWindowless_GetDropTarget 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。