指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加如的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。
1.首先从CListCtrl 继承一个类,命名为CXListCtrl
在头文件中加摸板
CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;
好在这里查找你的修改的颜色。
2.自己写个消息映射,可能添加不上,要自己写。
OnNMCustomdraw 为实现函数。
3.写OnNMCustomdraw函数。
4.修改指定一行的颜色。
5.修改全部行的颜色。
头文件:
#pragma once
class CCXListCtrl:public CListCtrl
{
public:
CCXListCtrl(){}
~CCXListCtrl(){}
public:
void SetItemColor(DWORD iItem, COLORREF color);
void SetAllItemColor(DWORD iItem, COLORREF TextBkColor);
void Clear();
private:
DECLARE_MESSAGE_MAP()
void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;
};
.cpp
#include "stdafx.h"
#include "CXListCtrl.h"
BEGIN_MESSAGE_MAP(CCXListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
END_MESSAGE_MAP()
void CCXListCtrl::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;
*pResult = CDRF_DODEFAULT;
}
}
break;
}
}
void CCXListCtrl::Clear()
{
MapItemColor.RemoveAll();
}
void CCXListCtrl::SetItemColor(DWORD iItem, COLORREF color)
{
MapItemColor.SetAt(iItem, color);//设置某行的颜色。
this->RedrawItems(iItem, iItem);//重新染色
//this->SetCheck(iItem,1);
this->SetFocus(); //设置焦点
UpdateWindow();
}
void CCXListCtrl::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;
}