【问题标题】:Changing color of a specific character in an item in CListCtrl in MFC在 MFC 的 CListCtrl 中更改项目中特定字符的颜色
【发布时间】:2013-05-28 18:58:13
【问题描述】:

我有一个 CListCtrl,我需要从列表中每个单元格的文本中更改特定字符/字符集(我通过比较选择)的颜色。

我知道如何在找到字符/字符集时更改单元格整个文本的颜色(通过使用“strstr”命令),但我找不到一个示例来说明如何仅更改字符/字符集。

这是我的代码示例:

    void Agenda::OnCustomdrawMyList( NMHDR* pNMHDR, LRESULT* pResult )
    {
        NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)pNMHDR;

        *pResult = CDRF_DODEFAULT;

        if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
            return;
        }else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
        {
            *pResult = CDRF_NOTIFYSUBITEMDRAW;
            return;
        }else if ( (CDDS_SUBITEM | CDDS_ITEMPREPAINT) == pLVCD->nmcd.dwDrawStage )
        {

            // So right now I am in the stage where a SUBITEM is PREPAINTED

            int nItem = pLVCD->nmcd.dwItemSpec;
            int nSubItem = pLVCD->iSubItem;

            char a[100];
            listControl.GetItemText(nItem,nSubItem,a,100);

            COLORREF textColorFound, textColorDefault;
            textColorDefault = RGB(0,0,0);
            pLVCD->clrText = textColorDefault;

            char* startingFrom;

            if( (startingFrom = strstr(a,filterText)) != NULL ) {
                    // Could I set a pointer here or something like that so
                    //   the coloring could start only from 'startingFrom'
                    //   and stop at 'strlen(filterText)' characters?

                textColorFound = RGB(205,92,92);
                pLVCD->clrText = textColorFound;
            }
            *pResult = CDRF_DODEFAULT;
        }
    }
  • listControl 是我的 CListCtrl 的变量
  • 其他的事情是不言自明的

【问题讨论】:

  • 我会说你需要拥有子项目。您使用的自定义绘制解决方案仅允许您更改整个子项的属性(文本或背景颜色、字体...),然后列表使用这些属性绘制它。我没有尝试过的一件事是在 CDDS_ITEMPOSTPAINT 阶段覆盖绘图。但这几乎是所有者在绘制之后绘制的。但是您可以选择何时需要这样做。
  • 我虽然可以避免使用 CustomDraw,但我会开始寻找。谢谢你的回答。

标签: c++ mfc clistctrl


【解决方案1】:

不,你不能这样做。您需要做的是自定义绘制有问题的文本。这会很棘手,因为您必须使用两个不同的调用来完成,在这两个调用之间您必须手动调整颜色和绘图位置以考虑字符间距等。您更好希望你不需要做多行输出。

请查看 Michael Dunn 在 CodeProject 上撰写的文章 Neat Stuff to Do in List Controls Using Custom Draw,了解如何继续操作。

或者,如果您可以使用 CodeJock 的 Toolkit Pro 工具包,您可以利用他们的“XAML”支持(我使用引号是因为它真的不是 XAML,而是他们自己实现的 XAML 的子集)并让他们完成所有艰苦的工作。

【讨论】:

  • 手动调整颜色和绘图位置
    那我该怎么做呢?这就是我要找的。我从 codeproject 知道那个教程。到目前为止我所做的就是从那里开始。
  • 你不能在每个字符的基础上这样做。您可以为 整个 字符串执行此操作。
【解决方案2】:

挖掘同样的问题;但我不会去修改/添加到默认的 Windows 行为来绘制字符串......显然这将是拥有它的终点。(aici am murit si eu :)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多