• ベストアンサー

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

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

noname#11718
noname#11718

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

  • ベストアンサー
  • 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

  • ドラッグ&ドロップについて

    VB.NETについて質問です。 ListViewでドラッグ&ドロップするコーディングをしているのですが、 外からListViewへのドラッグ&ドロップ(データ取り込み)、ListViewから外へのドラッグ&ドロップ(データ出力)、ListView内でのドラッグ&ドロップ(アイテム並べ替え)を区別する方法を教えて下さい。

  • リストビューでのドラッグ&ドロップでの反転表示

    VC++にてエクスプローラもどきを作成していて、 ドラッグ&ドロップの操作を実装中です。 ListViewにて、OnLButtonDown内で マウスで押下されたフォルダイメージを CreateDragImageで作成しマウスカーソルを変更しました。 そして、ドラッグ中に、別フォルダへカーソルが移動した際、 そのフォルダを反転させるために、 OnDragOver内で、まず、全ての選択状態をクリアし、 for ( i = 0; i < list.GetItemCount(); i++ ){   item.iItem = i;   ListView_GetItem( list, &item2 );   item2.state = 0;   item2.stateMask = LVIS_SELECTED;   ListView_SetItem( list, &item ); } 対象となるフォルダのLV_ITEMを取得後に、 item.state = LVIS_SELECTED; item.stateMask = LVIS_SELECTED; ListView_SetItem( list, &item ); を行い選択状態に変更させました。 一応、ドラッグ&ドロップは、ある程度できているのですが、 描画が汚く、下記の2点について困っています。 1.ドラッグされたフォルダの反転表示が綺麗ではない(画像参照) 2.カーソル下に何のフォルダも無い場合は、   全ての選択状態をクリアだけでDragOverの処理を終了しているが、   前回選択状態にしたフォルダが反転表示(汚い状態で…)されたまま なにか、修正方法はありますでしょうか?

  • フォームの外にドラッグ&ドロップ

    現在、VB2005においてアプリケーションを開発しています。 よく、リストボックスなどにドラッグ&ドロップしてパスを入力させる 方法がありますが、これの逆?をやりたいと思っております。 つまり、「すでにリストボックスなどに入力されたアイテムをフォームのそと にドラッグ&ドロップさせた場合にリストボックスからそのアイテムを さくじょする」という動作です。 フォームの外であることをどのように判断してよいかわからないため、 MouseUp,DragDropのイベントを受け取ることができません。 よろしくお願いします。

  • ドラッグ&ドロップができなくなってしまいました

    先日Windows XP SP3にアップデートした頃から、マウスでドラッグ&ドロップができなくなってしまいました。 正確言うと、ドロップができなくなった、のだと思います。 それも、デスクトップのアイコンや、エクスプローラで表示したアイコンに限ります。 ドラッグしていって、目的のところに移動しようとマウスのボタンを離しても、何も起こりません。 他のアプリケーションではドラッグ&ドロップは出来るんです。 たとえば、Safariのブックマーク整理などのときには、問題なく出来ます。 どなたか解決法が分かればお教えください。 よろしくお願いします。

  • ListViewで複数項目のドラッグ&ドロップ

    やりたいことは、エクスプローラのようなアイテムのドラッグ&ドロップです。 VB付属のリストビューをそのまま使うと、大きいアイコンで表示した時、複数選択してドラッグしても動くアイテムは、1つとなってしまいます。 複数アイテムを動かす方法を知っている方がいましたら教えてほしいのですが。 環境は、 Windows2000SP3 VisualBasic6SP5 です。

  • ListViewAからListViewBへのドラッグドロップ

    アプリケーション内にListViewAとListViewBがあります。 ListViewAの要素の中から必要なアイテムを、ListViewBへ 好きな位置へコピーしたいのです。 そのためには、ListViewA→ListViewBにドラッグ&ドロップが 有効かと考えたのですが、どういうソースコードで実現できるのか ご存知の方がいらっしゃいましたらご教授いただけませんでしょうか? C++、WindowsSDKのみ(MFC、.Netは使用不可)

  • ドラッグ&ドロップについて

    初歩的なことを教えて下さい。 VB6を使用してドラッグ&ドロップの処理を作成したいのですが、どのように行ったら良いのか分かりません。 内容は、フォーム上にある一つのアイコン(ピクチャーボックスなど)を、同フォームの別の領域に、ドラッグ&ドロップで追加させて表示させる処理となります。また、追加されたアイコンをそれぞれコード上で判別もできるのでしょうか? 宜しくお願いします。

  • VB6でのドラッグ&ドロップについてです

    VB6でのことなんですが、リネームツールを作ろうと思って色々やってるのですが、うまくいきません。 フォルダをドラッグ&ドロップをして、 text1にフォルダの中のファイル名を表示して、text2にファイル名をコピーしてリネーム、というようなものを作りたいと考えています。 フォルダをドラッグ&ドロップして表示されるのが、そのフォルダのフルパスになってしまいます。 ドラッグ&ドロップしたフォルダの中のファイル名だけを表示する方法はどうすればいいのでしょうか? よろしくお願いします。

  • ドラック&ドロップ

    他のHPにある画像をドラック&ドロップでFlashで動いているHPにドラック&ドロップしてきた画像を貼り付けたいのですが(一時的に)画像データを取得するようなメソッドがあるのかどうか、ご存じの方はお答え下さい。また、ありましたらその使い方もお願いします。

    • ベストアンサー
    • Flash
  • MFCのドラッグ&ドロップについて

    閲覧して頂きありがとうございます。 現在、WindowsXPでvc++6.0のMFC(ダイアログベース)を利用してダイアログを作り エディットボックスに入力されたファイルパスを利用して指定のファイルを 開く簡単なアプリを作ろうとしています。 そこでダイアログのエディットボックスの部分にファイルをドラッグ&ドロップすると エディットボックスにドロップされたファイルのパスを表示させようとしていますが、中々できません。 状況としては、グループボックスの中にエディットボックスを作成し、 グループボックスを右クリック→プロパティ→ドラッグドロップを許可 をすることによりグループボックスにドロップの許可を与えることはできていますが ドロップのイベントを拾うことができておりません。 ※参考サイトなどをみると「WM_DROPFILES」というハンドラがあるみたいなのですが  どこにも見当たらないです。。。 何か不明な点などあれば補足させて頂きますので、よろしくお願いします。