
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 …
//http://msdn.microsoft.com/ja-jp/library/k6y18z6a …
//ココでアイテムを書き直す
ListView_Update(list, i);
}
其の他、選択解除をした後アイテムを描くのではなく、リストビューコントロール全体を問答無用に再描画すると言う手段では駄目でしょうか。
http://msdn.microsoft.com/ja-jp/library/ax04k970 …
http://msdn.microsoft.com/ja-jp/library/2f3csed3 …
http://msdn.microsoft.com/ja-jp/library/cc410421 …
お返事ありがとうございます。
前回の補足記入後に、自己解決しました。
ListView_SetItemでitemの設定をし直すのではなく、
ListView_SetItemStateで状態だけを変更し、
RedrawItemsで再描画をしてやると上手くいきました。
ListView_SetItemで上手く行かないのは謎ですが。
ListView_Updateでも試してみましたが、
フォーカスが外れたフォルダの反転表示が
添付画像のように一部残ってしまい綺麗ではありませんでした。
OnDragOverで毎回再描画させてしまっているので、
画面のちらつきが気になるところですが、
とりあえずは、一旦終了することにします。
再度、改良する際に、またお力をお借りするかもしれませんが。
ありがとうございました。
No.1
- 回答日時:
こんばんは。
ドラッグ移動中に下に有るアイテムが反転すると言う事でしょうか。
う~む、取り敢えず、反転させる度にリストコントロールを再描画させて見ては如何でしょうか。
それ以外であるならばオーナードローでする事なのかもしれません。
この回答への補足
RedrawItemを行うことで、『1』の反転表示に関しては綺麗になりました。
ありがとうございました。
『2』に関してはRedrawItemでも改善しませんでした。
選択状態クリアの方法が間違っているのか。。。
(ちなみに、全ての選択状態をクリアするコーディングですが、
変数がitemとitem2で混在してましたが、記述ミスで、全てitem2です。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- WordPress(ワードプレス) Wordpress 複数プラグインの不具合? 1 2022/10/09 21:52
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- その他(IT・Webサービス) html cssについて 3 2023/05/13 12:48
- HTML・CSS Dreamweaver のテンプレートでの相対パスの設定について 2 2023/06/13 17:28
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
TextBoxに文字を書いても表示さ...
-
VC++プログラムをつかったBMP画...
-
word
-
[VB.net] DataGridViewの列ヘッ...
-
C#のタブコントロールについて...
-
MFCでOnPaintのタイミング
-
塗りつぶしモード ALTERNATEと...
-
VB.netでのライン描画方法がわ...
-
MFC 6.0 VC++ で、処理が重くな...
-
重いグラフィックス処理
-
OneNote 2010 文字と描画がずれる
-
ダイアログのボタンコントロー...
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
VB6,リストボックスの特定行の...
-
リストビューでのドラッグ&ド...
-
google Colabでmatplotlibの描...
-
WM_PAINT
-
(C# .Net) ToolStripのボタンの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報