如何更改CListCtrl列的颜色

时间:2013-10-30 12:38:30

标签: c++ mfc clistctrl

我想将特定列的背景颜色更改为对话框的颜色(灰色)。我该如何实现呢?

void CUcsOpTerminalDlg::OnCustomdrawFeatureList(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

  // TODO: change color 

  *pResult = 0;
}

由于

3 个答案:

答案 0 :(得分:2)

如果您使用的是“新”MFC Feature Pack类(VS 2008 SP1及更高版本),则可以使用CMFCListCtrl而不是CListCtrl并使用CMFCListCtrl::OnGetCellBkColor

您必须从中派生自己的类并覆盖CMFCListCtrl::OnGetCellBkColor。在那里,只需检查列索引并返回所需的背景颜色:

COLORREF CMyColorfulListCtrl::OnGetCellBkColor(int nRow,int nColumn)
{
    if (nColumn == THE_COLUMN_IM_INTERESTED_IN)
    {
        return WHATEVER_COLOR_I_NEED;
    }
    return CMFCListCtrl::OnGetCellBkColor(nRow, nColumn);
}

或者,如果您需要对话框来进行决策,您可以从该功能查询对话框:

COLORREF CMyColorfulListCtrl::OnGetCellBkColor(int nRow,int nColumn)
{
    COLORREF color = GetParent()->SendMessage(UWM_QUERY_ITEM_COLOR, nRow, nColumn);

    if ( color == ((COLORREF)-1) ) 
    { // If the parent doesn't set the color, let the base class decide
        color = CMFCListCtrl::OnGetCellBkColor(nRow, nColumn);
    }    
    return color;
}

请注意,UWM_QUERY_ITEM_COLOR是自定义消息。我通常使用已注册的Windows消息as explained here

答案 1 :(得分:0)

简答:填写CDDS_ITEMPREPAINT阶段的clrText和clrText Bk字段。

我读过的最好的文章。 Part 1Part 2

答案 2 :(得分:0)

自定义绘制API与广告完全不同。无论如何,以下代码将第二列绘制为绿色:

LPNMLVCUSTOMDRAW pNMLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
switch( pNMLVCD->nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
    *pResult = CDRF_NOTIFYITEMDRAW;
    break;

case CDDS_ITEMPREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    break;

case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
    if( pNMLVCD->iSubItem == 1 )
        pNMLVCD->clrTextBk = RGB(0,255,0);
    break;
}