- 締切済み
空のリストビューで1行おきに背景色を変える
リストビューで1行おきに背景色を変えたくて、 http://homepage3.nifty.com/mitui707/VisualC/VClistview_color.html/ を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。 が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。 色々と試してますが、まだ初心者のため間違っているのかうまくいきません。 どなたか助言をお願いします。 VC++6.0を使用しています。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 回答が未だ持ってないのであえて投函いたします。 質問者様の質問意図は十分に伝わっております。 ある程度試してみましたが、これは正攻法では不可能かもしれません。 かく言う私も、リストビューに着色した事がありますが、追加されたアイテム分のラインにしか着色しませんでした。 リストビューにアイテムが追加されたりするたびにWM_DRAWITEM又はそれに対応したメッセージハンドラがコールバックされ、そこでようやく一行分を着色する処理が発生するためです。 以下は私ならばこうするかも、というアイデアを記します。 (1)ダミーのアイテムを一つだけ常に存在させます。これは何かしらのデータでダミーである事を判定できるようにしておきます。 (2)一つアイテムが存在すれば、何か有るたびWM_DRAWITEMがコールバックされる筈です。 (3)コールバックをキャッチしたら、リストビューのハンドルに対してTreeView_GetItemHeightを使って、アイテムの縦幅を取り出し、 LPDRAWITEMSTRUCT::rcItem::topを基準に逆算して、LPDRAWITEMSTRUCT::hDCに向かってFillRectあたりで交互着色していく事になるでしょう。 何故このような逆算が必要かというのは、リストビュー自体が右端にある垂直スクロールバーによって、スクロールしている可能性があるからです。 スクロールされていると、アイテムのLPDRAWITEMSTRUCT::rcItem::topが大きくて、中途半端な数字を示す筈です。 可視領域の一番上がtop = 0とは限らないということです。 ・・・とまぁ、そんなこんなで、標準コントロールに入り組んだ着色をするには正攻法では達成できない事があるのです。 最後に付け加えるとすれば、ここまでのものを望んだ場合、CreateWindowExなどをクラスにラップして、独自のリストビューを実装してしまった方が早いかもしれません。 私の場合は、標準コントロールに大きな限界を感じたときは、最終決断として、独自のコントロールをクラスで作成してきました。 そちらの方が、痒い所に手が届きますし、機能追加も容易だからです。 御健闘お祈りいたします。
お礼
回答、ありがとうございます。 とりあえず、可視領域行数分、ダミーを挿入して着色し、実データを挿入する際にダミーを1行づつ削除するという姑息な手段を取りました。 まだ、新VisualC++6.0入門の「スーパービギナー編」,「ビギナー編」,「シニア編」の3冊で勉強した程度ですので、助言頂いた内容を理解するには未熟者でして...。 もう少し学習し、内容を理解できるようになったら、やって見ます。 (回答して頂いて、うれしかったです。)