在我的C ++ MFC应用程序中,我使用报告样式的CListView。如果值等于特定值,我需要一种连续着色的方法,即我有一个'有效性'列,如果值超出范围,则将该行着色为红色。
我知道我需要使用CustomDraw处理程序,因为自定义绘图意味着我可以更改绘图上下文。
答案 0 :(得分:3)
要添加自定义绘制处理程序,请单击“列表控件”,转到“属性”,然后单击“事件”。添加'NM_CUSTOMDRAW'控件事件处理程序。
如果第三列的行等于“否”,则此自定义绘制事件处理程序会在每行中着色:
void Test_ClientDlg::OnNMCustomdrawlistctrlvalues(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
int itemCnt = 0;
CString text;
RECT rc;
switch(lpLVCustomDraw->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
itemCnt = listAnalysisVals->GetItemCount();
for (int i = 0; i < itemCnt; i++)
{
//get each row text for 3rd column (position 2)
text = listAnalysisVals->GetItemText(i, 2);
if (text.Compare("No") == 0)
{
if (i == (lpLVCustomDraw->nmcd.dwItemSpec))
{
lpLVCustomDraw->clrTextBk = RGB(255,50,50);
listAnalysisVals->GetItemRect(i,&rc,LVIR_BOUNDS);
listAnalysisVals->InvalidateRect(&rc, 0);
}
}
}
break;
default: break;
}
*pResult = 0;
*pResult |= CDRF_NOTIFYPOSTPAINT;
*pResult |= CDRF_NOTIFYITEMDRAW;
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
}
这导致: