標準 CListCtrl 無法單獨設定單元格前景/背景色。本類繼承自支援排序的 CSortListCtrl (參考王駿《列表控件排序功能的實現》),處理 NM_CUSTOMDRAW 訊息實現逐格著色。
void CSortListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) {
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)pNMHDR;
switch (pLVCD->nmcd.dwDrawStage) {
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW; break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW; break;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT: {
int nItem = (int)pLVCD->nmcd.dwItemSpec;
int nSubItem = pLVCD->iSubItem;
COLORREF clrText, clrBkgnd;
if (GetItemColor(nItem, nSubItem, clrText, clrBkgnd)) { // 自訂查色函數
pLVCD->clrText = clrText;
pLVCD->clrTextBk = clrBkgnd;
}
*pResult = CDRF_DODEFAULT; break;
}
default: *pResult = CDRF_DODEFAULT;
}
}
m_MyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_MyListCtrl.SetHeadings(_T("ID,100;Name,100;BirthDate,100"));
m_MyListCtrl.AddItem(_T("1"), _T("欒義明"), _T("1979-07-25"));
m_MyListCtrl.AddItem(_T("2"), _T("張偉"), _T("1982-03-26"));
// 設定第 0 列第 1 欄 (姓名) 紅字綠底
m_MyListCtrl.SetItemColor(0, 1, RGB(255,0,0), RGB(0,255,0));

LVS_EX_FULLROWSELECT 才能正確繪製整列背景NM_CUSTOMDRAW 分階段通知:預繪→項繪→子項繪,層層返回 CDRF_NOTIFY*std::map<std::pair<int,int>, ColorPair> 或二維陣列