【问题标题】:How to change color of CListCtrl column如何更改 CListCtrl 列的颜色
【发布时间】:2013-10-30 12:38:29
【问题描述】:

我想将特定列的背景颜色更改为对话框的颜色(灰色)。我怎样才能实现它?

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

  // TODO: change color 

  *pResult = 0;
}

谢谢

【问题讨论】:

  • 看看MSDN文章Using Custom Draw
  • 另一个链接,有解释、例子等:Neat Stuff to Do in List Controls Using Custom Draw
  • 此方法仅绘制添加项目的单元格。我需要为整列着色,例如一列的所有单元格,即使它们是空的
  • @alex555 然后,您必须绘制 CListCtrl 的背景。我认为这是在 OnEraseBkgnd 中完成的。而且你必须弄清楚列的宽度,这样你就可以用你想要的颜色绘制正确的矩形。

标签: c++ mfc clistctrl


【解决方案1】:

如果您使用“新”MFC 功能包类(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

【讨论】:

  • 此方法是否为列中的每个单元格设置颜色?
  • 只有那些有物品的。这是变相的自定义绘制。事实上,没有项目的地方就没有“单元格”,所以我认为,正如我在另一条评论中所说,如果你想改变有的列的颜色,你必须绘制控件的背景没有项目。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    自定义绘图 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2013-08-29
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多