指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加入的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。
虽然说自带没有这个功能,但可以用NU_CUSTOMDRAW
我的环境是vc2010, 听说vc6 没有,需要手动添加。
新建一个mfc 对话框工程,并添加列表框控件,添加一些数据,让他能正常显示一个列表框的表格。这个时候还不能设置行颜色。
添加改变颜色的事件
打开MFC Class Wizard ,用如下方式添加列表框(我的是IDC_LIST2)的NU_CUSTOMDRAW事件,
然后把代码加入如下:
void CListCtrlTestDlg::OnCustomdrawList2(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: Add your control notification handler code here
//pNMCD->clrTextBk = RGB(51, 153, 255);
//pNMCD->clrText = RGB(255, 255, 255);
//*pResult = 0;
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
*pResult = 0;
//return ;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
*pResult =CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
if(lplvcd->nmcd.dwItemSpec==0)
{
lplvcd->clrTextBk = RGB(255,0,0); //红色
}
if(lplvcd->nmcd.dwItemSpec==1)
{
lplvcd->clrTextBk = RGB(0,255,0); //绿色
}
if(lplvcd->nmcd.dwItemSpec==2)
{
lplvcd->clrTextBk = RGB(0,0,255); //蓝色
}
if(lplvcd->nmcd.dwItemSpec==3)
{
lplvcd->clrTextBk = RGB(255,255,0); //黄色
}
if(lplvcd->nmcd.dwItemSpec==4)
{
lplvcd->clrTextBk = RGB(160,32,240); //紫色
}
if(lplvcd->nmcd.dwItemSpec==5)
{
lplvcd->clrTextBk = RGB(0,255,255); //青色
}
if(lplvcd->nmcd.dwItemSpec==6)
{
lplvcd->clrTextBk = RGB(255,97,0); //橙色
}
if(lplvcd->nmcd.dwItemSpec==7)
{
lplvcd->clrTextBk = RGB(0,255,127); //嫩绿色
}
if((lplvcd->nmcd.dwItemSpec)>7)
{
lplvcd->clrTextBk = RGB(0,0,0); //黑色
}
*pResult = CDRF_NEWFONT;
break;
}
}
编译运行结果如下:
代码解说:
开始我看到一文,事件产生的代码如下:
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: Add your control notification handler code here
后面好像会报错,改为文章代码才好,这个代码是别人用vc6 做的。
更多属性可以看微软的内容介绍:
这个代码只是设置0,1,2,3,4,5,6,7行的颜色,其他行都为黑色。当然只是演示功能的需要。
这里customdraw有几个阶段。
switch(lplvcd->nmcd.dwDrawStage) 就是判断阶段,只是在
case CDDS_SUBITEM | CDDS_ITEMPREPAINT: 才设置背景颜色。
其他阶段不要做。