IDropSource
COM公式ドキュメント
IDropSource インターフェイスは、アプリケーションでドラッグ アンド ドロップ操作を提供するために実装するインターフェイスの 1 つです。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ドラッグ アンド ドロップ操作を継続、キャンセル、または完了するかどうかを判断します。このメソッドを直接呼び出すことはありません。ドラッグ アンド ドロップ操作の間、OLE の DoDragDrop 関数がこのメソッドを呼び出します。
| fEscapePressed | BOOL | in | 前回の QueryContinueDrag の呼び出し以降(QueryContinueDrag の最初の呼び出しである場合は DoDragDrop の呼び出し以降)に Esc キーが押されたかどうかを示します。TRUE はエンド ユーザーが Esc キーを押したことを示し、FALSE は押されていないことを示します。 |
| grfKeyState | MODIFIERKEYS_FLAGS | in | キーボードの修飾キーの現在の状態です。指定できる値は、MK_CONTROL、MK_SHIFT、MK_ALT、MK_BUTTON、MK_LBUTTON、MK_MBUTTON、MK_RBUTTON の各フラグの任意の組み合わせです。 |
戻り値
このメソッドは次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| ドラッグ操作を継続する必要があります。この結果は、エラーが検出されず、ドラッグ アンド ドロップ操作を開始したマウス ボタンが離されておらず、Esc キーが検出されなかった場合に発生します。 | |
| ドロップ操作を実行してドラッグ操作を完了する必要があります。この結果は、grfKeyState がドラッグ アンド ドロップ操作を開始したキーが離されたことを示している場合に発生します。 | |
| ドロップ操作を実行せずにドラッグ操作をキャンセルする必要があります。この結果は、fEscapePressed が TRUE であり、Esc キーが押されたことを示している場合に発生します。 |
解説(Remarks)
DoDragDrop 関数は、ドラッグ アンド ドロップ操作の間にキーボードまたはマウス ボタンの状態の変化を検出するたびに QueryContinueDrag を呼び出します。QueryContinueDrag は、パラメーター grfKeyState および fEscapePressed の内容に基づいて、ドラッグ アンド ドロップ操作を継続、キャンセル、または完了するかどうかを判断する必要があります。
視覚効果を指定する列挙値を DoDragDrop 関数に提供することで、ドラッグ アンド ドロップ操作の間にソース アプリケーションがエンド ユーザーに視覚的なフィードバックを提供できるようにします。
| dwEffect | DROPEFFECT | in | IDropTarget::DragEnter、IDropTarget::DragOver、または IDropTarget::DragLeave の直近の呼び出しによって返された DROPEFFECT 値です。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| 戻り値 | 説明 |
|---|---|
| メソッドが正常に完了したことを示し、OLE が提供する既定のカーソルを使用してカーソルを更新するよう OLE に要求します。 |
解説(Remarks)
アプリケーションがユーザーによるドラッグ アンド ドロップ操作の開始を検出したら、DoDragDrop 関数を呼び出す必要があります。DoDragDrop はループに入り、マウスが最初にドロップ ターゲット ウィンドウに入ったときに IDropTarget::DragEnter を、マウスがターゲット ウィンドウ内で位置を変えたときに IDropTarget::DragOver を、マウスがターゲット ウィンドウから出たときに IDropTarget::DragLeave を呼び出します。
IDropTarget::DragEnter または IDropTarget::DragOver を呼び出すたびに、DoDragDrop は IDropSource::GiveFeedback を呼び出し、ドロップ ターゲットの呼び出しから返された DROPEFFECT 値を渡します。
DoDragDrop は、マウスがターゲット ウィンドウから出たときに IDropTarget::DragLeave を呼び出します。その後、DoDragDrop は IDropSource::GiveFeedback を呼び出し、dwEffect パラメーターに DROPEFFECT_NONE 値を渡します。
dwEffect パラメーターには DROPEFFECT_SCROLL を含めることができます。これは、ソースが適切なポインターのドラッグ スクロール用のバリエーションを表示する必要があることを示します。
実装者への注意
この関数は DoDragDrop ループの間に頻繁に呼び出されるため、実装をできる限り最適化することでパフォーマンス上の利点が得られます。IDropSource::GiveFeedback は、dwEffect パラメーターの値に基づいてカーソルの形状を変更したり、強調表示されたソースを変更したりする役割を担います。既定のカーソルを使用している場合は、DRAGDROP_S_USEDEFAULTCURSORS を返すことができ、これにより OLE が既定のカーソルを使用してカーソルを更新します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDropSource "{00000121-0000-0000-C000-000000000046}"
#usecom global IDropSource IID_IDropSource "{}"
#comfunc global IDropSource_QueryContinueDrag 3 int,int
#comfunc global IDropSource_GiveFeedback 4 int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。