【问题标题】:Change Background color of full column of CListCtrl in MFC在 MFC 中更改 CListCtrl 整列的背景颜色
【发布时间】:2013-11-25 14:48:32
【问题描述】:

我在 MFC 的报表视图中创建了一个 CListCtrl。 我想用灰色背景为第一列(整列,不仅是 Item 所在的那些单元格)着色。

我该怎么做? 谢谢

【问题讨论】:

  • 我将实现一个CMFCLisCtrl 派生类并覆盖OnGetCellBkColor 方法。这种方式比使用自定义绘图要容易得多。我在这里有这个答案,但是一些版主删除了它,因为他/她认为它等于我在stackoverflow.com/a/37571685/383779 OnGetCellBkColorOnGetCellTextColor 上提供的答案是不同的东西! 随便!

标签: c++ mfc clistctrl


【解决方案1】:

实现这一点的方法是分别为第一行的每个单元格着色。代码如下所示,基本上是一个蓝图,但它应该可以工作(注意:我没有为这篇文章测试这个)。您必须使用lplvcd->iSubItem 并绘制每一行的第一列。

void MyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVCUSTOMDRAW* cd = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

    *pResult = CDRF_DODEFAULT;

    switch( cd->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            *pResult = CDRF_NOTIFYITEMDRAW;
            break;

        case CDDS_ITEMPREPAINT:
            {
                int rowNumber = cd->nmcd.dwItemSpec;
                bool highlightRow = (bool)GetItemData(rowNumber);
                if (highlightRow)
                {
                    COLORREF backgroundColor;
                    backgroundColor = RGB(255, 0, 0);
                    cd->clrTextBk = backgroundColor;
                }
            }
            break;
        case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
            {

                // something like if(lplvcd->iSubItem == 0 ) to paint first column
                lplvcd->clrText = RGB(0,0,255);


                *pResult = CDRF_NEWFONT;
                return;
            }

        default:
            break;
    }
}

【讨论】:

    【解决方案2】:

    这里有两篇完美的文章,详细描述了自定义绘制。

    Part I & Part II

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多