IDragSourceHelper
COM公式ドキュメント
Shell によって公開され、Shell のドラッグアンドドロップ操作中に表示される画像をアプリケーションが指定できるようにします。
解説(Remarks)
このインターフェイスは Shell のドラッグイメージマネージャーによって公開されます。アプリケーションが実装するものではありません。
Shell のドラッグアンドドロップ操作中に表示される画像を指定するには、このインターフェイスを使用します。IDragSourceHelper、IDropTargetHelper、IInitializeWithWindow の各インターフェイスは、IDropTarget インターフェイスがカスタムのドラッグイメージを使用できるよう、ドラッグイメージマネージャーオブジェクトによって公開されます。これらのインターフェイスを使用するには、クラス識別子 (CLSID) に CLSID_DragDropHelper を指定して CoCreateInstance を呼び出し、インプロセスサーバーのドラッグイメージマネージャーオブジェクトを作成する必要があります。インターフェイスポインターは標準的な Component Object Model (COM) の手順を用いて取得します。
IDragSourceHelper インターフェイスは、ドラッグイメージとして使用するビットマップを指定する方法を次の 2 通り提供します。
- ウィンドウを持つコントロールは、そのウィンドウに対して DI_GETDRAGIMAGE ウィンドウメッセージを登録し、IDragSourceHelper::InitializeFromWindow でドラッグイメージマネージャーを初期化できます。DI_GETDRAGIMAGE メッセージを受信すると、ハンドラーはメッセージの lParam 値として渡された SHDRAGIMAGE 構造体にドラッグイメージのビットマップ情報を格納します。
- ウィンドウを持たないコントロールは、IDragSourceHelper::InitializeFromBitmap でドラッグイメージマネージャーを初期化できます。このメソッドを使うと、アプリケーションは単にビットマップを指定するだけで済みます。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ウィンドウを持たないコントロール用にドラッグイメージマネージャーを初期化します。
| pshdi | SHDRAGIMAGE* | in | ビットマップに関する情報を格納する SHDRAGIMAGE 構造体です。 |
| pDataObject | IDataObject* | in | データオブジェクトの IDataObject インターフェイスへのポインターです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
InitializeFromBitmap はアルファ値の計算時に常に RGB 乗算処理を行うため、アルファブレンディングを事前乗算していないビットマップを常に渡してください。事前乗算済みのアルファブレンディングを持つビットマップを渡してもエラーにはなりませんが、このメソッドは再度乗算を行うため、結果のアルファ値が二重になります。
ウィンドウを持つコントロール用にドラッグイメージマネージャーを初期化します。
| hwnd | HWND | inoptional | DI_GETDRAGIMAGE メッセージを受け取るウィンドウのハンドルです。この値は NULL にすることができます。 |
| ppt | POINT* | inoptional | ドラッグイメージ内でのカーソルの位置を指定する POINT 構造体へのポインターです。この構造体には、ドラッグイメージの左上隅からカーソル位置までのオフセットを格納します。この値は NULL にすることができます。 |
| pDataObject | IDataObject* | in | データオブジェクトの IDataObject インターフェイスへのポインターです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
DI_GETDRAGIMAGE メッセージを使用すると、カスタムコントロールからドラッグイメージを取得できます。このメッセージは Shlobj.h で定義されており、RegisterWindowMessage で登録する必要があります。hwnd で指定したウィンドウが DI_GETDRAGIMAGE メッセージを受け取ると、lParam 値には SHDRAGIMAGE 構造体へのポインターが格納されます。ハンドラーはこの構造体にドラッグイメージのビットマップ情報を格納する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDragSourceHelper "{DE5BF786-477A-11D2-839D-00C04FD918D0}" #usecom global IDragSourceHelper IID_IDragSourceHelper "{}" #comfunc global IDragSourceHelper_InitializeFromBitmap 3 var,sptr #comfunc global IDragSourceHelper_InitializeFromWindow 4 sptr,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDragSourceHelper "{DE5BF786-477A-11D2-839D-00C04FD918D0}" #usecom global IDragSourceHelper IID_IDragSourceHelper "{}" #comfunc global IDragSourceHelper_InitializeFromBitmap 3 sptr,sptr #comfunc global IDragSourceHelper_InitializeFromWindow 4 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。