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

问题描述 投票:0回答:3

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

理想情况下,我想知道如何使用库存列表控件来执行此操作。 但是,如果这是不可能的,请告诉我使用第 3 方代码的方法。

更新

这是我最终使用的代码:

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,并使用布尔值来指示是否应突出显示该行。

visual-c++ mfc row highlighting clistctrl
3个回答
6
投票

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

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

这篇代码项目文章可能是一个很好的起点。


-2
投票

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

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

希望有帮助。


-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);
© www.soinside.com 2019 - 2024. All rights reserved.