アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の処理を終了しているが、
  前回選択状態にしたフォルダが反転表示(汚い状態で…)されたまま

なにか、修正方法はありますでしょうか?

「リストビューでのドラッグ&ドロップでの反」の質問画像

A 回答 (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 …
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

前回の補足記入後に、自己解決しました。
ListView_SetItemでitemの設定をし直すのではなく、
ListView_SetItemStateで状態だけを変更し、
RedrawItemsで再描画をしてやると上手くいきました。
ListView_SetItemで上手く行かないのは謎ですが。

ListView_Updateでも試してみましたが、
フォーカスが外れたフォルダの反転表示が
添付画像のように一部残ってしまい綺麗ではありませんでした。

OnDragOverで毎回再描画させてしまっているので、
画面のちらつきが気になるところですが、
とりあえずは、一旦終了することにします。
再度、改良する際に、またお力をお借りするかもしれませんが。

ありがとうございました。

お礼日時:2009/03/11 11:43

 こんばんは。



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

この回答への補足

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

補足日時:2009/03/11 10:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!