質問: 空のリストビューで1行おきに背景色を変える リストビューで1行おきに背景色を変えたくて、 http://homepage3.nifty.com/mitui707/visualc/vclistview_color.html/ を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。 が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。 色々と試してますが、まだ初心者のため間違っているのかうまくいきません。 どなたか助言をお願いします。 vc++6.0を使用しています。
回答: こんばんは。 回答が未だ持ってないのであえて投函いたします。 質問者様の質問意図は十分に伝わっております。 ある程度試してみましたが、これは正攻法では不可能かもしれません。 かく言う私も、リストビューに着色した事がありますが、追加されたアイテム分のラインにしか着色しませんでした。 リストビューにアイテムが追加されたりするたびにwm_drawitem又はそれに対応したメッセージハンドラがコールバックされ、そこでようやく一行分を着色する処理が発生するためです。 以下は私ならばこうするかも、というアイデアを記します。 (1)ダミーのアイテムを一つだけ常に存在させます。これは何かしらのデータでダミーである事を判定できるようにしておきます。 (2)一つアイテムが存在すれば、何か有るたびwm_drawitemがコールバックされる筈です。 (3)コールバックをキャッチしたら、リストビューのハンドルに対してtreeview_getitemheightを使って、アイテムの縦幅を取り出し、 lpdrawitemstruct::rcitem::topを基準に逆算して、lpdrawitemstruct::hdcに向かってfillrectあたりで交互着色していく事になるでしょう。 何故このような逆算が必要かというのは、リストビュー自体が右端にある垂直スクロールバーによって、スクロールしている可能性があるからです。 スクロールされていると、アイテムのlpdrawitemstruct::rcitem::topが大きくて、中途半端な数字を示す筈です。 可視領域の一番上がtop = 0とは限らないということです。 ・・・とまぁ、そんなこんなで、標準コントロールに入り組んだ着色をするには正攻法では達成できない事があるのです。 最後に付け加えるとすれば、ここまでのものを望んだ場合、createwindowexなどをクラスにラップして、独自のリストビューを実装してしまった方が早いかもしれません。 私の場合は、標準コントロールに大きな限界を感じたときは、最終決断として、独自のコントロールをクラスで作成してきました。 そちらの方が、痒い所に手が届きますし、機能追加も容易だからです。 御健闘お祈りいたします。