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

このQ&Aのポイント
  • VC++にてエクスプローラもどきを作成し、ドラッグ&ドロップの操作を実装中です。
  • 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の処理を終了しているが、   前回選択状態にしたフォルダが反転表示(汚い状態で…)されたまま なにか、修正方法はありますでしょうか?

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

  • ベストアンサー
回答No.2

 こんにちは。補足頂きました。  全てのアイテムの選択状態を解除しながら、全てのアイテムを描画して行くと言うのでは駄目でしょうか。 for ( i = 0; i < list.GetItemCount(); i++ ) {   item.iItem = i;   ListView_GetItem( list, item );   item2.state = 0;   item2.stateMask = LVIS_SELECTED;   ListView_SetItem( list, &item );   //http://msdn.microsoft.com/en-us/library/aa453381.aspx   //http://msdn.microsoft.com/ja-jp/library/k6y18z6a(VS.80).aspx   //ココでアイテムを書き直す   ListView_Update(list, i); }  其の他、選択解除をした後アイテムを描くのではなく、リストビューコントロール全体を問答無用に再描画すると言う手段では駄目でしょうか。  http://msdn.microsoft.com/ja-jp/library/ax04k970(VS.80).aspx  http://msdn.microsoft.com/ja-jp/library/2f3csed3(VS.80).aspx  http://msdn.microsoft.com/ja-jp/library/cc410421.aspx

lhouse
質問者

お礼

お返事ありがとうございます。 前回の補足記入後に、自己解決しました。 ListView_SetItemでitemの設定をし直すのではなく、 ListView_SetItemStateで状態だけを変更し、 RedrawItemsで再描画をしてやると上手くいきました。 ListView_SetItemで上手く行かないのは謎ですが。 ListView_Updateでも試してみましたが、 フォーカスが外れたフォルダの反転表示が 添付画像のように一部残ってしまい綺麗ではありませんでした。 OnDragOverで毎回再描画させてしまっているので、 画面のちらつきが気になるところですが、 とりあえずは、一旦終了することにします。 再度、改良する際に、またお力をお借りするかもしれませんが。 ありがとうございました。

その他の回答 (1)

回答No.1

 こんばんは。  ドラッグ移動中に下に有るアイテムが反転すると言う事でしょうか。  う~む、取り敢えず、反転させる度にリストコントロールを再描画させて見ては如何でしょうか。  それ以外であるならばオーナードローでする事なのかもしれません。

lhouse
質問者

補足

RedrawItemを行うことで、『1』の反転表示に関しては綺麗になりました。 ありがとうございました。 『2』に関してはRedrawItemでも改善しませんでした。 選択状態クリアの方法が間違っているのか。。。 (ちなみに、全ての選択状態をクリアするコーディングですが、  変数がitemとitem2で混在してましたが、記述ミスで、全てitem2です。)

関連するQ&A

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

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

  • ツリービューでのドラッグイメージの作成方法

    VC++でエクスプローラもどきを作成しています。 ListViewからTreeViewへ、ファイルをドラッグする際、 マウスカーソルにファイルイメージを追従させようとしています。 ListView内でのドラッグは作成できたのですが、 TreeViewへ移った際に、CreateDragImageでドラッグを作成するためには HTREEITEMを渡さなくてはいけません。 TreeViewで表示させているのは、フォルダアイコンのみなので、 ファイルをドラッグした際に、該当するようなitemがありません。 TreeViewへitemをinsertして表示させるわけにはいかないのですが、 このような場合、どのようにして、 ドラッグイメージを作成すべきなのでしょうか?

  • ドラッグ&ドロップによる項目移動

    ドラッグ&ドロップによる項目の移動が出来るかどうかを教えて頂きたいです。 また出来るのであればやり方(参考サイト等)教えて下さい>< 検索してもドラッグ&ドロップでファイルパスの取得とかしか出ないので困っています>< ・リストボックスを2つ配置して選択している項目を2つのリストボックス間で移動したいです。 (1)リストボックス1の項目を選択 (2)リストボックス2へドラッグ&ドロップ (3)リストボックス1では選択されていた項目を削除、リストボックス2へは項目を追加 ・DataGridViewなどのテーブル表示の列の入れ替え Windowsのフォルダで「名前、更新日時、種類、サイズ、...」と並んでいる項目をマウス操作で入れ替えなど出来ますよね?あんな事も出来たりしませんかね? 「マウスでのドラッグ&ドロップで操作する」がポイントです よろしくお願いします。

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグドロップについてお聞きしたいことがあります。 ダイアログに読取専用エディットボックスとリストボックスをつけて フォルダをドロップするとエディットにはフォルダのフルパス、 リストにはフォルダ内のファイルが列挙されるというソフトを 作っております。 現状、リストへフォルダをドロップした場合は以上の動作をしますが エディットへドロップしても何の反応も起きません。 今回はエディットとリストどちらにドロップしても同様の動作をしたく、 ResourceViewで両方ドラッグドロップ許可にしていますが、 リストのほうはドロップするとアイコンには+がでて、 ドロップ可能のようになっていますが実際にはWM_DROPFILESすら 捕まえることができません。 読み取り専用がよくない等いろいろ試しては見ましたが できませんでした。 リストのほうをドロップ不可(エディットのほうのみ可能)にした場合も 何もおきなかったのですが、そもそもエディットボックスではドロップは 不可能なのでしょうか? 以上の点をご教授願いたいです。 よろしくお願いします。 開発環境は VC++6.0 Professional SP2 OSは WindowsXP です。

  • サンダーバードのフォルダへのドラッグ&ドロップ

    メールソフトのサンダーバード5.0を使用しています。 受信トレイのメールを、左側に並んでいるフォルダにドラッグ&ドロップして振り分ける作業の際、Outlookのようにドロップの時にフォルダの色が反転しないので、振り分けたいフォルダが選択されているか、上下の他のフォルダに入ってしまわないか、非常にわかりにくいです。 (特に複数のメールを選択して振り分ける際) これを解決するアドオンや設定などご存じの方、いらっしゃいましたらご教授お願い致します。

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

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

  • VBAでのリストビューにおけるドロップイベント

    リストビューにファイルをドロップした場合、適切に処理がされるんですが、不適切なデータ(たとえばブラウザ等で選択した文字列がドロップされた)だと下記のところでデータ形式が一致しないというエラーが出てしまいます。 Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) With Me AppActivate Me.Caption .ListView1.ListItems.Clear If Data.Files.Count <> 1 Then Exit Sub  ←データの形式が一致しません (Dataに不適切な値が入っている) 不適切なデータが入力された際に処理を実行しないようにするにはどのような手段があるのでしょうか? ご回答よろしくお願いします。

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

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

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグ&ドロップについてお聞きしたいです。 リストボックスにフォルダをドラッグしてそのフォルダの中身を リストに表示するというものを作りたく、ネットでいろいろ調べた所 以下のように作りました。 ResourceViewでドロップドラッグを許可にチェックを入れる case WM_CREATE:   DragAcceptFiles(::GetDlgItem(hWnd, IDC_LIST1), TRUE);   return TRUE; case WM_DROPFILES:   { // ドロップされた内容を取得   hdrop = (HDROP)wParam;   DWORD dwSize;   CHAR szPath[MAX_PATH+1];   ZeroMemory(szPath, sizeof(szPath));   int num = ::DragQueryFile(hdrop, -1, NULL, 0);   for (int i = 0; i < num; i++);{     dwSize = ::DragQueryFile(hdrop , i, szPath, MAX_PATH+1);     if (dwSize <= 0) //取得失敗     {       return FALSE;     }     else{ //以下にszPathから中身を表示させる処理 ・・・} 以上のようにするとドラッグしたファイルの数は 正しく取得しているのですがファイル名を得る関数部分で 1.i=0としているのに、最初からi=numの数になってしまう 2.二つ目のDragQueryFileのiを1にしても戻値(ファイル名のサイズ)は 0となって取得していない となってしまいます。 なぜこのようになってしまうのか、ご教授願います。 環境はVisual C++6.0 OSは windowsXP SP2です

  • ActiveBasic ListView 選択を移動させたい

    SendMessage関数を使って、ListViewの選択されているアイテムの場所を移動させたいのですが、 思うように動きません。 Dim lv As LVITEM With lv .iItem=PlayListNum[RandomFlag] .mask=LVIF_STATE .state=LVIS_SELECTED End With SendMessage(hList,LVM_SETITEM,0,VarPtr(lv)) ※hListには、ListViewのハンドルが格納されてあります。 ご存知の方、いらっしゃいましたら、やり方の方をご教授下さい。 Win XP AB 4.23.00

専門家に質問してみよう