在 MFC 中更改 CListCtrl 整列的背景颜色

Posted

技术标签:

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

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

我该怎么做? 谢谢

【问题讨论】:

***.com/q/19682479/385646的可能重复 我将实现一个CMFCLisCtrl 派生类并覆盖OnGetCellBkColor 方法。这种方式比使用自定义绘图要容易得多。我在这里有这个答案,但是一些版主删除了它,因为他/她认为它等于我在***.com/a/37571685/383779 OnGetCellBkColorOnGetCellTextColor 上提供的答案是不同的东西! 随便! 【参考方案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

【讨论】:

以上是关于在 MFC 中更改 CListCtrl 整列的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中更改 CListCtrl 的样式

MFC中CListCtrl控件怎样获取某列的列号

mfc的ClistCtrl控件列的排序

双击更改mfc中列表控件中行的颜色

MFC:CListCtrl.EnableWindow(FALSE),但仍可滚动? [复制]

MFC总结之CListCtrl用法及技巧