我有一个CListCtrl,我需要从列表中每个单元格的文本中更改A SPECIFIC字符/字符集(我通过比较选择)的颜色。
我知道当我找到字符/字符集时(通过使用'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;
}
}
答案 0 :(得分:2)
不,你不能这样做。您需要做的是自定义相关文本。这将是棘手的,因为您必须使用两个不同的调用,在这两个调用之间,您必须手动调整颜色和绘图位置以考虑字符间距等。并且您更好希望你不需要做多行输出。
看看Michael Dunn撰写的关于CodeProject的文章Neat Stuff to Do in List Controls Using Custom Draw,以获得有关如何继续的一些想法。
或者,如果您可以使用CodeJock的Toolkit Pro工具包,您可以利用他们的“XAML”支持(我使用引号,因为它不是真正的 XAML,而是他们自己的实现< em> XAML的子集)让他们做所有艰苦的工作。
答案 1 :(得分:0)
挖掘同一问题;但是我不会修改/添加到绘制字符串的默认Windows行为......显然这将是拥有它所有者绘制的终点。(aici am murit si eu :)。