• 締切済み

空のリストビューで1行おきに背景色を変える

リストビューで1行おきに背景色を変えたくて、 http://homepage3.nifty.com/mitui707/VisualC/VClistview_color.html/ を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。 が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。 色々と試してますが、まだ初心者のため間違っているのかうまくいきません。 どなたか助言をお願いします。 VC++6.0を使用しています。

みんなの回答

回答No.1

 こんばんは。  回答が未だ持ってないのであえて投函いたします。  質問者様の質問意図は十分に伝わっております。  ある程度試してみましたが、これは正攻法では不可能かもしれません。  かく言う私も、リストビューに着色した事がありますが、追加されたアイテム分のラインにしか着色しませんでした。  リストビューにアイテムが追加されたりするたびにWM_DRAWITEM又はそれに対応したメッセージハンドラがコールバックされ、そこでようやく一行分を着色する処理が発生するためです。  以下は私ならばこうするかも、というアイデアを記します。  (1)ダミーのアイテムを一つだけ常に存在させます。これは何かしらのデータでダミーである事を判定できるようにしておきます。  (2)一つアイテムが存在すれば、何か有るたびWM_DRAWITEMがコールバックされる筈です。  (3)コールバックをキャッチしたら、リストビューのハンドルに対してTreeView_GetItemHeightを使って、アイテムの縦幅を取り出し、 LPDRAWITEMSTRUCT::rcItem::topを基準に逆算して、LPDRAWITEMSTRUCT::hDCに向かってFillRectあたりで交互着色していく事になるでしょう。  何故このような逆算が必要かというのは、リストビュー自体が右端にある垂直スクロールバーによって、スクロールしている可能性があるからです。  スクロールされていると、アイテムのLPDRAWITEMSTRUCT::rcItem::topが大きくて、中途半端な数字を示す筈です。  可視領域の一番上がtop = 0とは限らないということです。  ・・・とまぁ、そんなこんなで、標準コントロールに入り組んだ着色をするには正攻法では達成できない事があるのです。  最後に付け加えるとすれば、ここまでのものを望んだ場合、CreateWindowExなどをクラスにラップして、独自のリストビューを実装してしまった方が早いかもしれません。  私の場合は、標準コントロールに大きな限界を感じたときは、最終決断として、独自のコントロールをクラスで作成してきました。  そちらの方が、痒い所に手が届きますし、機能追加も容易だからです。  御健闘お祈りいたします。

taka077
質問者

お礼

回答、ありがとうございます。 とりあえず、可視領域行数分、ダミーを挿入して着色し、実データを挿入する際にダミーを1行づつ削除するという姑息な手段を取りました。 まだ、新VisualC++6.0入門の「スーパービギナー編」,「ビギナー編」,「シニア編」の3冊で勉強した程度ですので、助言頂いた内容を理解するには未熟者でして...。 もう少し学習し、内容を理解できるようになったら、やって見ます。 (回答して頂いて、うれしかったです。)

関連するQ&A

  • リストビューの水平スクロール抑止と文字列の表示位置

    リストビューを使ったプログラムで、以下の2点についてどうしていいか分からないので、どなたか助言をお願いします。 (1)可視領域を23行としたリストビューで、起動時はスクロールを水平・垂直ともに抑止しておきます。ボタンをクリックする度に1行ずつ0行に挿入し、データが24行以上で垂直スクロールを許可してるのですが、挿入した行に+1行が表示されてしまいます。GetItemCount()で調べてもやはり1行多く表示されてます。カスタムドローで交互に背景色を変えていますが、その行に背景色はありません。水平スクロールを抑止している事が原因でしょうか?スクロールの抑止は、以下を参考にさせて貰ってます。 http://homepage3.nifty.com/mitui707/VisualC/VClistview_op1.html/ (2)ヘッダ部の表示はセンタリング、アイテムは左寄せにしたいのですが、アイテムの左寄せをどのようにすれば良いのか分かりません。 ヘッダ部の設定 LVCOLUMN myColumn; myColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; myColumn.fmt = LVCFMT_CENTER; どなたか助言をお願いします。

  • リストビューの選択状態を取得するメッセージはありますか?

    リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、エディットボックスが空欄では無いときに、 あるボタンを有効にするという処理をしたいと思っています。 リストビューが選択されていることを教えてくれるメッセージがあれば、教えてください。よろしくお願いします。 環境:Win32 API, VC++6.0

  • リストビューのスクロールについて

    VC.NET MFC でリストビュー(CListCtrl)を使用しています。 そのリストビューにある垂直スクロールバーを操作しても、 PreTranslateMessage()になにもコマンドが送られてきません。 ・・・(1) また、LVN_BEGINSCROLLのハンドラを追加してみたんですが、 コンパイル時にLVN_BEGINSCROLLを認識してもらえません。 (コンパイルエラー) ・・・(2) いろいろ調べてcommctrl.hをインクルードしても 必要なDLL(Comctl32.lib ? Comclt32.lib)をプロジェクトに参加させても認識してもらえませんでした。 リストビューのスクロールバー操作時の処理をオーバーロードしたいのですが、できなくて困っています。 どのようにすればよろしいでしょうか? 助言のほどよろしくお願いします。

  • リストビューで選択行の背景を変える

    お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。 if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {  // 選択行の背景色を変更  if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {   lplvcd->clrTextBk = RGB(255, 0, 0);   lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;  } else {   lplvcd->clrTextBk = RGB(255, 255, 255);  }  return CDRF_NOTIFYSUBITEMDRAW; } デバッグモードで見ると、else以降の分は解釈されていないようです。 リストビューは g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 , WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS, 1 , 1 , width , lv_height , g_hMain , (HMENU)1 , g_hInst , NULL); dwStyle = ListView_GetExtendedListViewStyle(g_hList); dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES; ListView_SetExtendedListViewStyle(g_hList, dwStyle); ListView_SetBkColor(g_hList, RGB(240,240,240)); のようにしています。宜しくお願いします

  • リストビューに隠しパラメータ

    お世話になります。 現在リストビューに、列幅0の隠し列を用いてデータをやりとりしています。この方法以外に個々の行にパラメータを与えることは可能でしょうか? ウィンドウハンドルにパラメータを与えることでウィンドウプロシージャに値を渡す(やり方忘れました)ように、リストビューの個々の行に値を格納できるのではないかと思うのですが・・・ 宜しくお願いします。

  • プルダウンリストの背景色の指定

    お世話になります。 現在作成しているwebページがあり、下記のようにプルダウンリストの背景色を設定しております。 <select> <option style="background-color: #FF0000;">サンプル1</option> <option style="background-color: #00FF00;">サンプル2</option> <option style="background-color: #0000FF;">サンプル3</option> <option style="background-color: #FFFFFF;">サンプル4</option> </select> このページにおきまして、サンプル3を選択したときに、プルダウンリストに「サンプル3」と表示され、背景色が#0000FFになるようにしたいのですが、 上記のままだと、IEでは背景色も変化しますが、firefoxですとプルダウンリスト内に「サンプル3」と表示されても背景色は白のままです。 IEとおなじ動きになるようにするには、どうしたらよいでしょうか。 ちなみに、 <select style="background-color: #FF0000"> にすると、IE、firefoxともにプルダウンリストの背景色が変更できたので、javascriptでoptionのvalueをとり、それをselectのstyleに設定できれば。。。 と考えたのですが、javascriptはほぼ無知なので、上記の方法でも解決できずでした。 簡単に解決できる方法などございますでしょうか。 もしくは、javascriptで解決できますでしょうか。 どうぞ宜しくお願いいたします。

    • ベストアンサー
    • HTML
  • リストビューに色はつかない?

    CreateWindowEx を使ったリストビュー(WC_LISTVIEW) についてなんですが、 マクロの、ListView_InsertItem (hList, &item) で、リストに追加しますよね。 その際、カラーはできないのでしょうか。 例えば、一行おきに色を変えるとか・・・ SetTextColor(hdc, RGB(0, 255, 0)) とか SendMessage(hList, WM_SETFONT, (WPARAM)hFont, 0) とかいろいろ 見たり試したりしたのですが、無理なんでしょうか。

  • リストビューのアイコンの色

    VC++6.0でプログラミングしてるんですが、リストビューのアイコンの色がインポートしたビットマップを色とは違う、白黒になってしまいます。アイコンをつくるのには m_myIcon.Create(IDB_ICON, 32, 4, RGB(255, 255, 255)); m_listctrl.SetImageList(&m_myIcon, LVSIL_NORMAL); 以上のようにしてます。m_myIconはCImageListクラスのオブジェクトで、このリストビューがあるクラスのメンバ変数です。m_listctrlはリストビューのコントロール型の変数です。 ご存知の方、アイコンをビットマップ通りのカラーにする方法を教えてください。

  • リストビューの項目の内容を変更する方法は?

    お世話になります。 VS2005を使用しています。 VB.NETのリストビューで一覧を作ったのですが、その中の項目の内容をプログラム内から変更することは出来ないのでしょうか? 色々検索してみたのですが見つかりませんでした。 現在、リストビューには4つの項目があり、100行くらい有ります。 (1つ目の項目にはチェックボックス付き) その中の、項目の内容を変更したいのです。 やはり、以下のようにしなければいけないのでしょうか。 1)一旦対象行の内容を保存 2)対象行を削除 3)保存先で内容変更 4)リストビューに再追加 よろしくご享受下さい。

  • 【vb6】リストビューへのアイコンの追加

    お世話になります。 vb6のリストビューについて質問があります。 リストビューに作った複数の列(現状はヘッダーで区切っただけの擬似的なもの)に対して、 例えば”1行目の4列目にアイコンを設定する"といった事をやりたいのが方法がわかりません。 グリッドを使えば楽なのは分かっているのですが、今回は見た目の都合上リストビューで作りたいと考えています。 またAPIを使えば画面に絵を貼り付けられるのも承知していますが、そのようなことをしなくても 標準の機能でアイコンを追加することは出来ると昔聞いたもので、APIではない方法を探しています。 どなたかご存知の方がいらっしゃればどうか教えてください。 よろしくお願いします。

専門家に質問してみよう