MFC CListView自定义绘图 - 如果文本等于值,则为颜色行

时间:2014-12-08 06:52:13

标签: c++ listview visual-c++ mfc row

在我的C ++ MFC应用程序中,我使用报告样式的CListView。如果值等于特定值,我需要一种连续着色的方法,即我有一个'有效性'列,如果值超出范围,则将该行着色为红色。

我知道我需要使用CustomDraw处理程序,因为自定义绘图意味着我可以更改绘图上下文。

1 个答案:

答案 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;
}

这导致:

enter image description here