mfc 列表框行颜色设置方法

指定改变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 做的。

更多属性可以看微软的内容介绍:

https://docs.microsoft.com/zh-cn/windows/win32/api/commctrl/ns-commctrl-nmlvcustomdraw?redirectedfrom=MSDN

这个代码只是设置0,1,2,3,4,5,6,7行的颜色,其他行都为黑色。当然只是演示功能的需要。

这里customdraw有几个阶段。

switch(lplvcd->nmcd.dwDrawStage) 就是判断阶段,只是在

case CDDS_SUBITEM | CDDS_ITEMPREPAINT:  才设置背景颜色。

其他阶段不要做。

发布了131 篇原创文章 · 获赞 112 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/leon_zeng0/article/details/100734929