设置listContrl中指定行的颜色

在MFC中 自己通过手动拖放CListCtrl控件来制作自己的表格; 

目的: 将指定item的行更该颜色;

步骤:

1,在窗口中拖放CListCtrl控件, 单击右键 创建控件对象:

CListCtrl m_list;

2, 手动新建类 CMyListCtrl :public CListCtrl 

类实现代码:

1.1,CMyListCtrl.h
#pragma once
#include "afxcmn.h"



class CMylistCtrl :
 public CListCtrl
{
public:
 CMylistCtrl(void);
public:
 ~CMylistCtrl(void);

public:
 afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
 void SetItemColor(DWORD item, COLORREF color);

 CMap<DWORD , DWORD& , COLORREF , COLORREF&> MapItemColor;
 DECLARE_MESSAGE_MAP()
};


1.2, CMyListCtrl.cpp

BEGIN_MESSAGE_MAP(CMylistCtrl, CListCtrl)
 ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
 //    ON_WM_SIZE()
END_MESSAGE_MAP()
CMylistCtrl::CMylistCtrl(void)
{
}
CMylistCtrl::~CMylistCtrl(void)
{
}
void CMylistCtrl::OnNMCustomdraw( NMHDR *pNMHDR, LRESULT *pResult )
{
 *pResult = CDRF_DODEFAULT;
 NMLVCUSTOMDRAW * lplvdr = (NMLVCUSTOMDRAW*)pNMHDR;
 NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
 switch (lplvdr->nmcd.dwDrawStage)//判断状态
 {
 case CDDS_PREPAINT:
  *pResult = CDRF_NOTIFYITEMDRAW;
  break;
 case CDDS_ITEMPREPAINT:
  COLORREF ItemColor;
  //根据在SetItemColor(DWORD iItem, COLORREFcolor) 设置的//ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
  if (MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
  {
   //lplvdr->clrText = RGB(0,0,0)//ItemColor
   lplvdr->clrTextBk = ItemColor;
   *pResult = CDRF_DODEFAULT;
  }
  break;
 }
}
void CMylistCtrl::SetItemColor( DWORD item, COLORREF color )
{
 // m_iCurrentItem = iItem;
 // m_CurrentColor = color;
 MapItemColor.SetAt(item, color);//设置某行的颜色
 this->RedrawItems(item,item);//重新染色
 
 //this->SetCheck(item,1);
 this->SetFocus();//设置焦点
 UpdateWindow();
}

4, 在MFC中包含CMyListCtrl.h 

然后进行替换:

CListCtrl m_list; ->  CMyListCtrl m_list;


其他不变;

5, 在你需要的地方更改颜色:


m_list.SetItemColor(item, (DWORD)RGB(255,255,255));



原文地址:https://www.cnblogs.com/skyhuangdan/p/5486775.html