这个问题困扰了我几天,终于搞出来了,方法如下。
增加NM_CUSTOMDRAW消息。至于为什么要使用以及如何使用这个消息,请看下面的解释:
http://hi.baidu.com/winnyang/blog/item/4f0e29511e9cc2858d543026.html
如何使用:
http://blog.csdn.net/songsu/archive/2009/11/12/4802459.aspx
下面说我如何解决的:
在MFC class wizard中增加NM_CUSTOMDRAW消息处理函数,然后注释掉原先代码,再下面加入如下代码:
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage){
*pResult = CDRF_NOTIFYSUBITEMDRAW;
//COLORREF clr;
//clr = RGB(255, 0 , 0);
//*pResult = CDRF_DODEFAULT;
}else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT|CDDS_SUBITEM))
{
//int nItem = pLVCD->iSubItem;
int nItem = static_cast <int> (pLVCD-> nmcd.dwItemSpec);
if (nItem == nNeedDrawItem)
{
COLORREF clr;
clr = RGB(255, 0 , 0);
pLVCD->clrTextBk = clr;
}else
{
pLVCD->clrTextBk = RGB(255, 255,255);
}
*pResult = CDRF_DODEFAULT;
}
,最后再你想改变行颜色的地方调用listctrl的redrawitems函数。
例如在我这里做如下调用:
if (!strcmp(listitem->webalive,"否"))
{
//AfxMessageBox(A2W(listitem->webalive));
nNeedDrawItem = listitem->item;
m_listresult.RedrawItems(nNeedDrawItem,nNeedDrawItem);
}