MFC:如何更改ListCtrl各行的颜色/粗体?

时间:2012-01-11 16:14:54

标签: visual-c++ mfc row highlighting clistctrl

使用MFC和Visual Studio 2010 C ++。我需要一种方法来使CListCtrl的某些单独行显得突出(但是我不想使用内置的选择功能来突出显示行)。它可能是行背景的颜色,或字体粗细,甚至可能是图像(如果是高性能的)。

理想情况下,我想知道如何使用库存清单控件来完成此操作。但是,如果无法做到这一点,请告诉我使用第三方代码的方法。

更新

以下是我最终使用的代码:

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;

        default:
            break;
    }
}

就我而言,我没有使用ItemData做任何事情,所以我在其他地方用一个布尔值调用了SetItemData,以指示是否应突出显示该行。

3 个答案:

答案 0 :(得分:5)

这里的关键信息是发送到CListCtrl(以及其他一些控件)的NM_CUSTOMDRAW消息。它允许您告诉Windows您要自定义绘制CListCtrl的某些部分。我们的想法是,该消息允许您告诉应该自定义绘制控件的哪个部分。因为自定义绘制整个CListCtrl只是为了改变单元格的文本颜色将是完全矫枉过正。

不用担心,您不必自己处理自定义绘图:该消息允许为控件的一个特定行或单元格设置字体和/或文本/背面颜色。

This codeproject article可能是一个很好的起点。

Here is a shorter code example设置CListCtrl中特定行的颜色。

答案 1 :(得分:-2)

您可以使用以下代码更改整个列表背景颜色,但我不确定是否支持更改每行颜色的功能。以下是代码:

YourControl.SetBkColor(RGB(212,208,200));

我希望它有所帮助。

答案 2 :(得分:-3)

以下是我对我的计划所做的事情, 如果我想要突出显示的行是cin或cout或任何其他只是将此代码放在该行上方

SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x0F);

最后一部分,即0x0F让你改变背景和文字的颜色代码

将其更改为您想要的颜色后,只需在要突出显示的行下面插入另一个,即

 SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x0C);

这是颜色表及其代码

    0 = Black       8 = Gray
    1 = Blue        9 = Light Blue
    2 = Green       A = Light Green
    3 = Aqua        B = Light Aqua
    4 = Red         C = Light Red
    5 = Purple      D = Light Purple
    6 = Yellow      E = Light Yellow
    7 = White       F = Bright White

示例表示黑色背景和蓝色文字;

SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x01);