OLEドラッグ&ドロップ機能を実装したいと思います。これを行うには、マウスボタンがクリックされて移動されたことを検出する必要があります。私はDoDragDrop
と呼んで、ドラッグ&ドロップ機能を開始します。IDropSourceNotify - 実装方法
ドラッグ&ドロップ機能を受け取るには、その前にRegisterDragDrop
に電話して、ドラッグ&ドロップ操作の対象としてウィンドウを登録する必要があります。ほとんどのアプリケーションと同様に、私のメインウィンドウは、いくつかのサブウィンドウに基づいて:TreeView
、ListView
、Edit
などです。IDropTarget::DragOver
の場合、ターゲットサブウィンドウがドラッグ&ドロップ操作を受け入れるかどうかを検出できます。ターゲットのサブウィンドウがドラッグ&ドロップ操作を受け入れる場合、これはうまくいきます。別のアプリケーションからオブジェクトをドラッグし、マウスカーソルも表示されます。
私のアプリケーション内でドラッグ&ドロップ機能をDoDragDrop
で開始すると、マウスカーソルが自動的に変更されるようになりました。どうして?
したがって、IDropSource::GiveFeedback
メソッドを使用して、ターゲットサブウィンドウのカーソルを変更できます。しかし、私はどのサブウィンドウがカーソルを変更しなければならないかを知ることができない。
私が正しいとすれば、IDropSourceNotify
はこの情報を提供する必要があります。しかし、このクラスをDragの&ドロップ操作にどのように関与させることができますか?
さらに、ソースウィンドウが自分のアプリケーションの中にある場合は自分自身でマウスカーソルを処理しなければならない理由はわかりませんが、ソースウィンドウが他のアプリケーションの中にある場合は自動的に処理されます。
最後に、私のサブウィンドウのカーソルをIDropSource::GiveFeedback
に変更すると、変更したように表示されます。しかし、私の主なスレッドはDoDragDrop
の中にあるので、私はWindowsがどのように変更されたカーソルを検出するのだろうかと思います。私が正しいのであれば、WindowsはWM_NCHITTEST
というメッセージでアプリケーションを尋ねます。カーソルは表示されます。しかし、メインスレッドはDoDragDrop
の内部でブロックされていますが、私のアプリケーションはこのメッセージにどのように答えますか?
私はDelphi XE4をWindow 7システムで使用しています。
オブジェクトは2つのインタフェース 'IDropSourceNotify'と' IDropSource'を実装する必要があります。'IDropSource'を' DoDragDrop'に渡すと、 'IDropSourceNotify'システムが' IDropSource'で 'QueryInterface'を呼び出したときに発生します。 – RbMm
@RbMmここでIDropSourceNotifyがどのように関連しているのか分かりません。 IDropSourceNotifyはVistaで導入され、IDropSource(カーソルの制御機能を含む)はW2Kで導入されました。 – SpeedFreak
@SpeedFreak - 質問は「IDropSourceNotify'をどのように実装するのか」ということで、後でそのIDropSourceNotifyが導入されたのは何ですか? – RbMm