参考自(http://blog.csdn.net/ribut9225/article/details/6720639)
1.首先从CListCtrl 继承一个类,命名为CListCtrlCl
在头文件中加摸板
CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;好在这里查找你的修改的颜色。
CListCtrlCl.h如下:
#pragma once // CListCtrlCl class CListCtrlCl : public CListCtrl { CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor; DECLARE_DYNAMIC(CListCtrlCl) public: CListCtrlCl(); virtual ~CListCtrlCl(); protected: DECLARE_MESSAGE_MAP() afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult); public: afx_msg void SetItemColor(DWORD iItem, COLORREF color); afx_msg void SetAllItemColor(DWORD iItem,COLORREF TextBkColor); };
2.自己写个消息映射,可能添加不上,要自己写。OnNMCustomdraw 为实现函数
BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) // ON_WM_SIZE() END_MESSAGE_MAP()
3.写OnNMCustomdraw函数。
void CListCtrlCl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Add your control notification handler code here *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://如果为画ITEM之前就要进行颜色的改变 { COLORREF ItemColor; if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor)) // 根据在 SetItemColor(DWORD iItem, COLORREF color) 设置的 // ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。 { //lplvdr->clrText = RGB(0,0,0);//ItemColor; //lplvdr->clrTextBk = ItemColor; lplvdr->clrText = ItemColor; *pResult = CDRF_DODEFAULT; } } break; } }
4. 修改指定一行的颜色。
void CListCtrlCl::SetItemColor(DWORD iItem, COLORREF color) { // m_iCurrentItem = iItem; // m_CurrentColor = color; MapItemColor.SetAt(iItem, color);//设置某行的颜色。 this->RedrawItems(iItem, iItem);//重新染色 //this->SetCheck(iItem,1); this->SetFocus(); //设置焦点 UpdateWindow(); }
5.修改全部行的颜色。
void CListCtrlCl::SetAllItemColor(DWORD iItem,COLORREF TextBkColor) { //INT_PTR ncount = this->GetItemCount(); if(iItem > 0) { for(DWORD numItem = 0; numItem < iItem ;numItem ++) { //iItem = i; MapItemColor.SetAt(numItem, TextBkColor); this->RedrawItems(numItem, numItem); } } return; }
6.
1)在自己项目dialog中加入列表控件,先定义普通列表控件,关联变量(如ObjectList)
2)然后在对应的头文件,将CListCtrlCl ObjectList; 改为 CXListCtrl m_list,
3)注意要包括自写类的头文件,头文件中加入 #include "ListCtrlCl.h"
cpp文件中调用相应函数
if(lw_all_wz[i].CompareNoCase(L"无裂纹: ")==0) ObjectList.SetItemColor(i,RGB(255,255,255));//白色 else{ ObjectList.SetItemColor(i,RGB(255,0,0));//红色 }
i对应的从0行开始
另外还参考MSDN(https://msdn.microsoft.com/en-us/library/ms364048(VS.80).aspx#customdraw_topic4 )
(http://blog.sina.com.cn/s/blog_7b053996010183u1.html)