• ベストアンサー

リストビュー内でのドラッグ&ドロップ

MFCのCListView内の表示されるアイテムのドラッグ&ドロップを許容させるにはどうすればいいのでしょうか? 外からのドロップはMainFrameでキャッチできたのですが、CListView内でのドラッグ&ドロップがどうしてもできないので、お分かりになる方がいましたら、教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

つまりLVN_BEGINDRAGのメッセージハンドラを追加しても呼び出されない、という状況ですね。 VisualC++.NET 2003 MFC使用 SDI CListViewのモードはreport という環境で試してみました。 LVN_BEGINDRAGのメッセージハンドラを追加した後、 リストビューのアイテムをドラッグしようとすると、このハンドラが呼び出されました。 reportモードにした他はスタイルを変更していません。

noname#11718
質問者

お礼

おおーー!! そうです。まさにそうです。 reportモードにしたらLVN_BEGINDRAGのメッセージハンドラが呼び出されました。 これで後続処理が追加できます。 MASATO3さんありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.1

私が前にリストビューからドラッグ&ドロップが可能なアプリケーションを作ったときは、 フラグを一つ立てればお終いというような簡単な話ではありませんでした。 結構大変だと思いますので御覚悟下さい。 今回の質問ですが、 (1) 一つのアプリケーションのウィンドウ内だけでドラッグ&ドロップが完結すれば良い (2) それとも他のアプリケーション(デスクトップ含む)にまでドロップできるようにする という2点のどちらを求めているのかによって答えがだいぶ変わります。 (1)の場合でしたら、 ドラッグ&ドロップの開始をLVN_BEGINDRAGメッセージハンドラで捕らえ、 CWnd::SetCaptureでマウスがウィンドウの外に出ても大丈夫なようにしておき、 ドロップをOnLButtonUpで捕らえてドロップ処理を行い、 ドロップ処理を行った後ReleaseCaptureでマウスを解放する、という流れになります。 (2)の場合でしたら、 ドラッグ&ドロップの開始をLVN_BEGINDRAGメッセージハンドラで捕らえ、 COleDataSourceインスタンスを作成し、 COleDataSourceインスタンスにドラッグ&ドロップ用のデータを設定し、 COleDataSource::DoDragDropを呼び出してドラッグ開始 ドロップ処理の方は外からのドラッグ&ドロップを捕らえる方法(COleDropTargetを使う方法)と 同じですので省略します。 (2)の方が大変だと思います。 「ドラッグ&ドロップ用のデータ」の形式など、上記以外に 調べることも考えることもたくさんあります。 もCOleDataSourceをキーワードに検索サイトで色々調べてみて下さい。

noname#11718
質問者

補足

実現させたいのは(1)です。 質問の補足なのですが、現状リストビューのアイテム自体がドラッグできない状態で、(アイテムを左クリックで選択はできるが、ドラッグでアイテムを掴めない)これは、Window生成時のスタイル指定が不足しているのでしょうか? ですので現状は(1)よりさらに前です。 すいません。質問内容が薄かったです。

すると、全ての回答が全文表示されます。

関連するQ&A