WINXP .NET MFCです。
リストビュー1からリストビュー2へのドラッグ&ドロップの初歩的なコードを作りました。
OnLButtonDown
OnMouseMove
OnLButtonUp
OnLvnBegindrag
を使い、bool nFlgがtrueの時に、カーソルを差し替えるようにしました。
OnLButtonUpで、nFlg=false; です。
だいたい問題なく動いているのですが、ドラッグ中にリストビューのコラムヘッダやスクロールバーの上で、マウスボタンから指を離しても、OnLButtonUpが呼ばれません。
その結果、nFlgがfalseにならないので、指はボタンから離れているのに、ポインタがコラムヘッダやスクロールバーの外に出ても、カーソルはドラッグ&ドロップ用のもののままになります。
(コラムヘッダやスクロールバーの上では、逆にカーソルはデフォルトの矢印に戻っています。)
SetCapture();も、別なコントロールにドラッグする時は、使えないようで、
(過去ログにありました)
煮詰まりました。
アドバイスをお願いいたします。
たしか LVN_BEGINDRAG ってただの通知メッセージで
ドラッグ & ドロップの実装は自分でやるものだったと思います。
なので実際の処理は自分で ::SetCapture() するなり
::DoDragDrop() 呼び出すなりしないとダメだったと思います。
もしかしたら、forty-five さんのお話を正しく理解していないかもしれませんが、もちろん実装してあるのです。
ほぼ問題はなく動きます。
ただ、マウスポインタがリストビューのスクロールバーとコラムヘッダの上にある時だけ、OnMouseMoveやOnLButtonUpが呼ばれなくなってしまうのです。
自己解決しました。
m_list1からm_list2にドラッグ&ドロップするのに、m_list1のOnLButtonUp
でReleaseCaptureした後で、m_list2の座標を取得して、マウスポインタがその範囲内にある時に処理を行い、そのままm_list1のクラスからm_list2を再描画しました。
OnLButtonUpでの座標は、m_list1の左上が原点でした。
ツイート | ![]() |