CListViewである列だけ行ごとに任意の文字色に変更したい – プログラミング – Home

CListViewである列だけ行ごとに...
 
通知
すべてクリア

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


秀水
 秀水
(@秀水)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

はじめまして、秀水といいます。
環境は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;
  }
}

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


引用未解決
トピックタグ
秀水
 秀水
(@秀水)
ゲスト
結合: 23年前
投稿: 14
 

すみません。
コメント文に誤りがありました。m(_ _)m

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

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


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

CListCtrl::SetItemTextじゃあ駄目なんですか?


返信引用
秀水
 秀水
(@秀水)
ゲスト
結合: 23年前
投稿: 14
 

おはようございます。

>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をどう使って色を変更すればいいのかわからないのですが。

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


返信引用
クラフトマン
 クラフトマン
(@クラフトマン)
ゲスト
結合: 23年前
投稿: 72
 

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


返信引用
秀水
 秀水
(@秀水)
ゲスト
結合: 23年前
投稿: 14
 

GetItemTextで解決しました♪

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

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

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


返信引用
むむむ
 むむむ
(@むむむ)
ゲスト
結合: 23年前
投稿: 11
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました