6

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

理想情况下,我想知道如何使用库存列表控件来做到这一点。但是,如果这是不可能的,那么请告诉我使用 3rd 方代码的方法。

更新

这是我最终使用的代码:

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

4

3 回答 3

5

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

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

这篇 codeproject 文章可能是一个很好的起点。

这是一个较短的代码示例,用于设置 CListCtrl 中特定行的颜色。

于 2012-01-12T12:31:14.860 回答
-2

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

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

我希望它有所帮助。

于 2012-01-12T12:04:02.307 回答
-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);
于 2013-04-26T11:28:16.900 回答