1

Windows API を使用してウィンドウのみのアプリケーションを作成しているため、このウィンドウ内のすべてが Direct2D を使用して描画されます。

今、ウィンドウのクライアント領域の特定の部分にいくつかのファイルをドロップしたいので、メッセージを処理していますWM_DROPFILES。ここでは問題ありません。これらの特定の領域にファイルがドロップされた場合、それらを正しく処理でき、すべてが正常に機能しています。ところで、私のウィンドウはDragAcceptFiles(hWnd, true)、常にドラッグ/ドロップを受け入れます。

マウスがあるウィンドウの領域に応じてマウスカーソルを変えたい. ドロップを扱わない領域では、カーソルを無効なアイコンにしたい.私はドロップを処理します。正しいドロップ アイコンが必要です。

私が最初に気付いたのは、ファイルがウィンドウにドラッグされているときにメッセージが生成されないことです。このため、マウス フック ( WH_MOUSE_LLusing SetWindowsHookEx) を追加しました。フックが処理されると、WM_MOUSEMOVEメッセージだけを見るので、マウスがいる領域に応じてカーソルを変更できます。

問題はSetCursor、ウィンドウがファイルのドラッグを受け入れるように構成されている場合、 が何もしないことです。何回呼び出しても、カーソルは常にドラッグ/ドロップ カーソルSetCursorです。

このようにカーソルを変更することは不可能に思えますが、私が達成しようとしていることを行う他の方法はありますか?

4

1 に答える 1

4

インターフェイスを実装するコードにクラスを記述し、IDropTargetそのクラスのインスタンスを作成して に渡し、それをRegisterDragDrop()ウィンドウに関連付ける必要があります。もう使用しないでくださいDragAcceptFiles()

ユーザーがウィンドウ上で何か (ファイルだけでなく) をドラッグするたびに、それに応じてIDropTarget::DragEnter()およびIDropTarget::DragOver(),IDropTarget::DragLeave()メソッドが呼び出され、ドラッグの現在の座標とドラッグされているデータに関する情報が提供されます (したがって、ドラッグされていないデータを除外できます)。受け入れたい)。データを受け入れることを選択し、ユーザーが実際にデータをウィンドウにドロップすると、IDropTarget::Drop()メソッドが呼び出されます。

ドロップ ターゲットとして、カーソルを変更するのはあなたの責任ではありません。代わりに、必要に応じてそれを処理するのはドロップ ソースの責任です。IDropTarget::DragEnter()およびIDropTarget::DragOver()実装では、出力パラメータを適切な値に設定するだけpdwEffectですDROPEFFECT。その値はドロップ ソースに戻され、ドロップ ソースはそのIDropSource::GiveFeedback()実装で視覚的なフィードバック (カーソルの変更など) をユーザーに表示します。

ユーザーの操作なしで呼び出すことができますIDropTarget(つまり、ドラッグ アンド ドロップ操作だけでなく、別のアプリからプログラム可能)。これが、ドロップ ターゲットではなくドロップ ソースが UI の更新をユーザーに表示するかどうかを決定する理由です。ドロップ ソースだけがIDropTarget最初にあなたを呼び出している理由を知っているからです。ドロップ ターゲットは、呼び出された理由を認識 (または気に) せず、何らかのデータが与えられ、そのデータを受け入れるか拒否するかを尋ねられるだけです。

詳細については、MSDN を参照してください。

OLE とデータ転送

ドラッグ アンド ドロップとクリップボードによるシェル オブジェクトの転送

于 2013-09-17T20:07:54.090 に答える