【问题标题】:MFC: How to change color/boldness of inidividual rows of ListCtrl?MFC:如何更改 ListCtrl 各行的颜色/粗体?
【发布时间】:2012-02-08 00:12:39
【问题描述】:

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

【问题讨论】:

  • 这确实是我想到的 ;-) 关于GetItemData(rowNumber),你在cd-&gt;nmcd.lItemlParam 中没有它吗
  • @Serge-appTranslator:啊,好点子,可以节省通话时间。我得试试。

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


【解决方案1】:

这是我对我的程序所做的, 如果我要突出显示的行是 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);

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      希望对你有帮助。

      【讨论】:

      • 一切皆有可能。
      • 是的,我现在相信了。
      猜你喜欢
      • 2023-01-30
      • 2022-08-17
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多