可以实现指定项的文本颜色与背景颜色
1. 重绘CListCtrl类
继续上一篇文章中"制作一个简单的 CListCtrl"
添加一个MFC的类, CListCtrlColor 继承 CListCtrl类
工程中会多出一个 .h 与 .cpp
在类视图中,添加一个NM_CUSTOMDRAW的消息OnNMCustomdraw
则VS会在此类的.h 与.cpp自动添加如下代码:
则VS将在类中自动添加如下代码:
.h
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
.cpp
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CListCtrlColor::OnNMCustomdraw)
void CListCtrlColor::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
}
处理OnNMCustomdraw 函数,最终如下:
voidCListCtrlColor::OnNMCustomdraw(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMCUSTOMDRAWpNMCD=reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult= 0;
NMLVCUSTOMDRAW*lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
NMCUSTOMDRAW&nmcd=lplvdr->nmcd;
switch(lplvdr->nmcd.dwDrawStage)
{
caseCDDS_PREPAINT:
*pResult=CDRF_NOTIFYITEMDRAW;
break;
caseCDDS_ITEMPREPAINT:
{
COLORREF ItemColor;
if(MapItemColor.Lookup(nmcd.dwItemSpec,ItemColor))
{
lplvdr->clrText=ItemColor;
*pResult=CDRF_DODEFAULT;
}
}
break;
}
}
再在.h 中添加
CMap<DWORD,DWORD& ,COLORREF,COLORREF&>MapItemColor;
voidSetItemColor(DWORD iItem,COLORREFcolor);
再添加文字颜色处理函数
.h
void SetItemColor(DWORD iItem, COLORREF color); // public
.cpp
voidCListCtrlColor::SetItemColor(DWORDiItem,COLORREFcolor)
{
MapItemColor.SetAt(iItem,color);
this->RedrawItems(iItem,iItem);
UpdateWindow();
}
2. 文本颜色处理
再回到原来的XXListCtrlDlg.h中, 添加
#include"ListCtrlColor.h"
将 CListCtrlm_wndLstCtrl;
改写成
CListCtrlColorm_wndLstCtrl;
并在XXListCtrlDlg.cpp的OnBnClickedBtnAdd函数最后,
添加
COLORREF color=RGB(255, 0, 0);
m_wndLstCtrl.SetItemColor(nNum,color);
可以实现添加行的文字变成红色
还可以:
COLORREF colRed=RGB(255, 0, 0),
colorBlk=RGB(0,0,255);
// 其它行为绿色显示
for(inti=0;i<nNum;i++)
{
m_wndLstCtrl.SetItemColor(i,colorBlk);
}
// 新增行为红色显示
m_wndLstCtrl.SetItemColor(nNum,colRed);
最终效果: 新增项为红色,其它为蓝色
源码下载: http://www.kuaipan.cn/file/id_2335083524523906.html