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

IOleInPlaceObjectWindowless

COM
IID1c2056cc-5ef4-101b-8bc8-00aa003e3b29継承元IOleInPlaceObject自前メソッド開始 vtbl9

公式ドキュメント

ウィンドウレスオブジェクトがウィンドウメッセージを処理し、ドラッグアンドドロップ操作に参加できるようにします。IOleInPlaceObject インターフェイスから派生し、それを拡張したものです。

メソッド 2

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

vtbl 9 HRESULT OnWindowMessage(DWORD msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult)

コンテナーから、インプレースアクティブなウィンドウレスオブジェクトへメッセージをディスパッチします。

msgDWORDinWindows からコンテナーに提供されるウィンドウメッセージの識別子。
wParamWPARAMinWindows からコンテナーに提供されるウィンドウメッセージのパラメーター。
lParamLPARAMinWindows からコンテナーに提供されるウィンドウメッセージのパラメーター。
plResultLRESULT*outウィンドウメッセージの結果コードへのポインター。

戻り値

成功した場合、このメソッドは S_OK を返します。その他の戻り値には次のものがあります。

Return code Description
S_FALSE
ウィンドウレスオブジェクトはウィンドウメッセージを処理しませんでした。コンテナーは、このメッセージに対して DefWindowProc を呼び出すか、後述のようにメッセージ自体を処理する必要があります。

解説(Remarks)

コンテナーは、インプレースアクティブなウィンドウレスオブジェクトへウィンドウメッセージを送信するためにこのメソッドを呼び出します。コンテナーは、次のガイドラインに従ってメッセージをディスパッチする必要があります。

次のメッセージについては、コンテナーはまず、マウスをキャプチャしているウィンドウレスオブジェクトがあればそこへメッセージをディスパッチします。それ以外の場合、コンテナーはマウスカーソルの下にあるウィンドウレスオブジェクトへメッセージをディスパッチします。該当するオブジェクトがない場合、コンテナーは次のメッセージを自身で処理してかまいません。

次のメッセージについては、コンテナーはキーボードフォーカスを持つウィンドウレスオブジェクトへメッセージをディスパッチする必要があります。 その他すべてのメッセージについては、コンテナーは自身でメッセージを処理する必要があります。

ウィンドウレスオブジェクトは、メッセージを処理しなかったことを示すために、このメソッドに対して S_FALSE を返すことができます。その場合、コンテナーは DefWindowProc 関数を呼び出してメッセージの既定の動作を実行するか、メッセージ自体を処理します。

コンテナーは、次のウィンドウメッセージを既定のウィンドウプロシージャに渡す必要があります。

コンテナーは、次のウィンドウメッセージを自身で処理する必要があります。
Note WM_SETCURSOR については、コンテナーはカーソルを自身で設定するか、何もしないかのいずれかを選択できます。
オブジェクトは、IOleInPlaceSiteWindowless::OnDefWindowMessage を使用して、コンテナーによる既定のメッセージ処理を明示的に呼び出すこともできます。WM_SETCURSOR メッセージの場合、これによりオブジェクトは、コンテナーがカーソルを設定しないときに処理を行うことができます。

wParam および lParam でオブジェクトに渡されるすべての座標は、含んでいるウィンドウのクライアント座標として指定されます。

vtbl 10 HRESULT GetDropTarget(IDropTarget** ppDropTarget)

ドラッグアンドドロップをサポートする、インプレースアクティブなウィンドウレスオブジェクトの IDropTarget インターフェイスを取得します。

ppDropTargetIDropTarget**outウィンドウレスオブジェクトへのインターフェイスポインターを受け取る IDropTarget ポインター変数へのポインター。

戻り値

成功した場合、このメソッドは S_OK を返します。その他の戻り値には次のものがあります。

Return code Description
E_NOTIMPL
ウィンドウレスオブジェクトはドラッグアンドドロップをサポートしていません。

解説(Remarks)

ウィンドウを持つオブジェクトは、RegisterDragDrop 関数を呼び出し、そのウィンドウハンドルをパラメーターとして指定することで、自身の IDropTarget インターフェイスを登録します。IDropTarget インターフェイスを登録することで、オブジェクトはドラッグアンドドロップ操作に参加できるようになります。ウィンドウレスオブジェクトは、アクティブなときにウィンドウを持たないため、自身の IDropTarget インターフェイスを登録できません。したがって、コンテナーからのサポートなしには、ドラッグアンドドロップ操作に直接参加することはできません。

ウィンドウレスオブジェクトが関与するドラッグアンドドロップ操作では、次のイベントが発生します。

オブジェクトは、データオブジェクト内のいずれのデータ形式も受け付けないことを示すために、自身の IDropTarget::DragEnter から S_FALSE を返すことができます。その場合、コンテナーはデータを自身で受け付けることを決定し、自身の IDropTarget::DragEnter メソッドまたは IDropTarget::DragOver メソッドから適切な dwEffect を返すことができます。

IDropTarget::DragEnter から S_FALSE を返すオブジェクトは、間に IDropTarget::DragLeave を挟まずに後続の IDropTarget::DragEnter 呼び出しを受け取る可能性に備える必要があります。実際、コンテナーの次の IDropTarget::DragOver 呼び出し時にマウスが依然として同じオブジェクトの上にある場合、コンテナーはそのオブジェクトに対して再度 IDropTarget::DragEnter を呼び出そうとすることがあります。

呼び出し元への注意

コンテナーは、後で使用するためにオブジェクトの IDropTarget インターフェイスへのポインターをキャッシュできます。
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 指定が可能。