ListCtrl的字體顏色如果直接通過SetTextColour設置的話會改變所有行的字體顏色,sdk的對話框工程想要改變ListCtrl的某一行顏色需要注意一下幾點:
1.在ListCtrl的父窗口響應WM_NOTIFY消息。
2.處理WM_NOTIFY的NM_CUSTOMDRAW消息,處理完之後通過SetWindowLong設置對話框返回結果。
3.處理完返回結果後對話框的回調函數要返回1。
具體代碼如下:
LRESULT TableDraw (LPARAM lp)
{
int iRow;
LPNMLVCUSTOMDRAW pListDraw = (LPNMLVCUSTOMDRAW)lp;
switch(pListDraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
return (CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW);
case CDDS_ITEMPREPAINT:
{
//pListDraw->clrText = RGB(0, 0, 255);
pListDraw->clrTextBk = RGB(221, 222, 201);
}
return CDRF_NEWFONT;
default:
break;
}
return CDRF_DODEFAULT;
}
VOID OnNotify(HWND hdlg, WPARAM wp, LPARAM lp)
{
NMHDR *header = (LPNMHDR)lp;
if (s_dev_list == header->hwndFrom && NM_CUSTOMDRAW == header->code)
{
LPNMLISTVIEW pnm;
pnm = (LPNMLISTVIEW)lp;
if(pnm->hdr.hwndFrom == s_dev_list && pnm->hdr.code == NM_CUSTOMDRAW)
{
SetWindowLong(hdlg, DWL_MSGRESULT, long(TableDraw(lp)));
}
}
}
BOOL CALLBACK MainProc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp)
{
int ret = 0;
switch(msg)
{
case WM_INITDIALOG:
{
OnInitDialog(hdlg);
}
break;
case WM_NOTIFY:
{
OnNotify(hdlg, wp, lp);
ret = 1;
}
break;
case WM_CLOSE:
EndDialog(hdlg, 0);
break;
default:
break;
}
return ret;
}