【发布时间】: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,但我会开始寻找。谢谢你的回答。