CListViewである列だけ行ごとに任意の文字色に変更したい

[戻る]
秀水 [E-Mail] 2001/10/17(水) 13:32:01
はじめまして、秀水といいます。
環境はWin98,VC++6.0,MFC です。

CListViewで任意の列(たとえば2列目)の文字色を
その文字の内容によって色を変更したいのですが…。

カスタムドローで任意の列の文字色を変更することまではできたのですが
指定行列の内容(文字列)の取得ができません。

Draw時に内容を取得するのではなく、行の色情報をメンバー変数を作成して
リストにデータを追加するときに行の色情報をその追加する文字列から
判断してメンバー変数に保持
Drawでは色情報のメンバー変数[行の情報(lplvcd->nmcd.dwItemSpec)]
で lplvcd->clrText を変更しようかとも思ったのですが
カラムクリック時にソートの処理が実装していることと、
Listへのデータ追加はInsertItemで先頭に追加しているので
可能ならばDraw時に文字列を取得して色をセットしたいと思っているのですが ^_^;


void CListViewColorView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
  LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

  switch(lplvcd->nmcd.dwDrawStage){
  case CDDS_PREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    break;
  case CDDS_ITEMPREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    break;
  case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
    *pResult = CDRF_DODEFAULT;
    if( lplvcd->iSubItem == 1 ) { //2行目なら
//ここでもし内容が"AAA"ならば文字色を赤にするという処理にしたいのですが
//どのように内容を取得すればいいのかがわかりません
      if(                )
        lplvcd->clrText = RGB(255, 0, 0);
      else
        lplvcd->clrText = GetSysColor(COLOR_WINDOWTEXT);
      *pResult = CDRF_NEWFONT;
    } else {
      lplvcd->clrText = GetSysColor(COLOR_WINDOWTEXT);
      *pResult = CDRF_NEWFONT;
    }
    break;
  default:
    *pResult = CDRF_DODEFAULT;
  }
}


すみませんがどなたかアドバイス頂けないでしょうか
宜しくお願いします。

秀水 2001/10/17(水) 14:00:04
すみません。
コメント文に誤りがありました。m(_ _)m

×  if( lplvcd->iSubItem == 1 ) { //2行目なら

○  if( lplvcd->iSubItem == 1 ) { //2列目なら
                      ~~
でした。
よろしくお願いいたします。

CdS 2001/10/18(木) 00:11:00
CListCtrl::SetItemTextじゃあ駄目なんですか?

秀水 2001/10/18(木) 08:52:35
おはようございます。

>CListCtrl::SetItemTextじゃあ駄目なんですか?
と回答いただいたのですが、ちょっとうかがってもよろしいですか?
私の認識が間違っているようなら訂正願います。

CListViewなので
データの追加はたとえばボタン押下時などに

 CListCtrl& lst = GetListCtrl();

 int idx = lst.InsertItem( 0,"001");
 lst.SetItemText( idx, 1, "AAA");
  lst.SetItemText( idx, 2, "あああ");

としております。
で、私の認識はリストにデータが追加、更新されたとき
(InsertItem,SetItemText実行時)に
OnCustomDraw関数が呼ばれると思っているのですが…。
根本的に考え方が間違っていますか?
CListCtrl::SetItemTextをどう使って色を変更すればいいのかわからないのですが。

すみません、ご指摘お願いいたします。

クラフトマン 2001/10/18(木) 14:18:38
おそらくCdSさんは、CListCtrl::GetItemTextのことをおっしゃって
いるのだと思います。
コールバック項目でもちゃんと取れます。
または、もしItemDataに必要な情報を含んだクラスのポインタなんか
が設定されているなら、NMCUSTOMDRAW構造体のlItemlParamメンバに
それが渡されているはずなので、それをみてもいいですね。

秀水 2001/10/18(木) 15:25:02
[[解決]]
GetItemTextで解決しました♪

こちらに投稿する前にlItemlParamでなんとかできないかと
この変数からアイテムの内容を取得できないかと悪戦苦闘してました。
どうも上手く取得できなくて…。(いつもNULLなんです。)
きっと見方が間違っていると思うのですが、どう取得すればわからずじまいです(__;

if( lplvcd->iSubItem == 1 ) { //2列目なら
の後にGetItemTextで内容を取得
その取得した内容を次の if で判断して色を変えることができました。

CdSさん、クラフトマンさんありがとうございました。m(_ _)m

むむむ 2002/03/28(木) 09:37:00
[[解決]]
ありがとうございました。

古いスレッドには追加発言できません。