3

我有一个 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 的变量
  • 其他的事情是不言自明的
4

2 回答 2

2

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

看看 CodeProject 上 Michael Dunn 的文章Neat Stuff to Do in List Controls Using Custom Draw以获得一些关于如何继续的想法。

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

于 2013-05-28T22:40:23.473 回答
0

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

于 2013-06-01T04:56:26.437 回答