
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
word
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
iPhoneアプリで作成したアプリ...
-
C# ラバーバンドの描画を快適に...
-
リストビューでのドラッグ&ド...
-
画面リサイズ時のちらつきをな...
-
MFC ビットマップ描画で残像が残る
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
win32api 画面のちらつき
-
GDI+で高速な描画
-
GDI+について
-
重いグラフィックス処理
-
最前面に無理やりフォームを持...
-
panelのスクロール表示について
-
Minecraft 統合版(PC)の描画距...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
panelのスクロール表示について
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
CScrollViewの使用方法について
-
GDI+について
-
VC++プログラムをつかったBMP画...
-
ウインドウサイズを変更しても...
-
VB6,リストボックスの特定行の...
-
タブをオーナードローすると、...
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
C++にて、塗りつぶされた円を描...
おすすめ情報