MFC中ListCtrl,改变具体单元格的文本和背景颜色
下面展示一些
内联代码片
。
先要创建NM_CUSTOMDRAW的消息
// A code block
var foo = 'bar';
// An highlighted block
void CStudentDlg::OnNMCustomdrawList(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 = mList.GetItemText(nItem, pLVCD->iSubItem);//当前行的某一列的内容
switch (pLVCD->iSubItem)//pLVCD->iSubItem表示当前列,等到所有列都遍历完才会进入下一行
{
case 3://表明处理到此行的第3列时
{
int age = atoi((CT2A(strTemp.GetBuffer())));//字符串转int
if (age > 22 || age < 18)//当年龄超过范围,设置字体颜色异常
{
clrNewTextColor = RGB(255, 0, 0);
clrNewBkColor = RGB(255, 255, 255);
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
}
else //正常年龄范围为黑色文本
{
pLVCD->clrText = RGB(0, 0, 0);
pLVCD->clrTextBk = RGB(255, 255, 255);
}
*pResult = CDRF_DODEFAULT;
break;
}
case 4://表明处理到此行的第4列时
{
int height = atoi((CT2A(strTemp.GetBuffer())));//字符串转int
if (height > 190 || height < 150)//当身高超过范围,设置字体颜色异常
{
clrNewTextColor = RGB(0, 0, 255);
clrNewBkColor = RGB(255, 255, 255);
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
}
else //正常年龄范围为黑色文本
{
pLVCD->clrText = RGB(0, 0, 0);
pLVCD->clrTextBk = RGB(255, 255, 255);
}
*pResult = CDRF_DODEFAULT;
break;
}
default://默认为黑色文本
pLVCD->clrText = RGB(0, 0, 0);
pLVCD->clrTextBk = RGB(255, 255, 255);
*pResult = CDRF_DODEFAULT;
break;
}
}
}
下面的第3列和第四列就是对应上面case 3和case 4的处理