CListCtrl 类里面没有直接改变单元格背景及文字颜色的成员函数,只有改变整个背景的颜色。我有时候只是需要把某个单元格的颜色改变来突出显示就可以了:
我们可以通过重载ListCtrl控件的Customdraw 消息,然后在里面写一些代码就可以了;
void CGPRSDlg::OnNMCustomdrawListshow(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT ==pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the notification message for an item. We‘ll request
// notifications before each subitem‘s prepaint stage.
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec );
CString strTemp=m_listshow.GetItemText(nItem,pLVCD->iSubItem );
switch(pLVCD->iSubItem)
{
case 11:
case 12:
case 13:
case 14:
case 15:
{
if(strcmp(strTemp,"ON")==0)
{
clrNewTextColor = RGB(0,255,0);
clrNewBkColor = RGB(255,255,255);
}
if(strcmp(strTemp,"OFF")==0)
{
clrNewTextColor = RGB(122,122,122);
clrNewBkColor = RGB(255,255,255);
}
pLVCD->clrText =clrNewTextColor;
pLVCD->clrTextBk =clrNewBkColor;
*pResult = CDRF_DODEFAULT;
break;
}
default:
pLVCD->clrText = RGB(0,0,0);
pLVCD->clrTextBk = RGB(255,255,255);
*pResult = CDRF_DODEFAULT;
break;
}
}
上面的代码中pLVCD->nmcd.dwItemSpec : 意思是listctrl 第几行的索引值;
pLVCD->iSubItem :意思是某行的某列的索引值,通过这两个值我们就可以知道,现在要改的是哪个单元格了。
然后pLVCD->clrText 是这个单元格的文本颜色;
pLVCD->clrTextBk是这个单元格的背景颜色;
我们是如果这个是我们需要改的我们就给它一个新值,如果不是我们要改的我们就给他默认值。这样就
可以改变我们的单元格的颜色了。
下面我们可以给一个实际的例子,比如我们的ListCtrl是一个显示某台设备的参数的值,这些参数我们接收过来后,我们可以做一个判断,如果某项参数超过我们设定的报警值我们可以改变它的颜色来突出显示这个参数,这样岂不更直观;
。。。。。。
case 7:
{
if(strTemp>paravalue1 || strTemp<paravalue2)
{
clrNewTextColor = RGB(255,0,0);
clrNewBkColor = RGB(255,255,255);
}
else
{
clrNewTextColor = RGB(0,0,0);
clrNewBkColor = RGB(255,255,255);
}
pLVCD->clrText =clrNewTextColor;
pLVCD->clrTextBk =clrNewBkColor;
*pResult = CDRF_DODEFAULT;
break;
}
。。。。。。
当我们接受的一项参数在我们设置的报警值范围我们就把这个参数用红色字体显示出来。Ok这样就可以动态显示了;如果觉得这样还不方便,我们可以重写CListCtrl类,然后里面增加一个改变单元格颜色的成员函数,就可以更方便了;