未继承CListCtrl自定义类,如何修改插入数据的文本颜色?
问题分析与解决
你遇到的核心问题是代码中对文本颜色的赋值被后续语句覆盖,导致针对"F"文本的颜色设置完全失效,同时自定义绘制的阶段处理逻辑也需要调整以适配子项颜色修改需求。
问题代码的关键错误
在CDDS_ITEMPREPAINT分支中,你先判断strValue == _T("F")时设置了红色文本,但紧接着执行了pLVCD->clrText = crText,这直接覆盖了之前的颜色设置,导致你的条件判断无法生效。
另外,CDDS_ITEMPREPAINT阶段默认仅处理整行的绘制通知,此时iSubItem的值为0,若要针对具体子项单独设置颜色,必须在CDDS_SUBITEMPREPAINT阶段处理。
修正后的代码
void CClassView::OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); *pResult = 0; if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { // 通知控件需要处理项和子项的绘制事件 *pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW; } else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwItemSpec) { // 设置整行的基础文本颜色 COLORREF crText; if ((pLVCD->nmcd.dwItemSpec % 3) == 0) crText = RGB(255, 0, 0); else if ((pLVCD->nmcd.dwItemSpec % 3) == 1) crText = RGB(0, 255, 0); else crText = RGB(128, 128, 255); pLVCD->clrText = crText; *pResult = CDRF_NOTIFYSUBITEMDRAW; // 继续触发子项绘制通知 } else if (CDDS_SUBITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { int nItemIndex = static_cast<int>(pLVCD->nmcd.dwItemSpec); int nSubItemIndex = static_cast<int>(pLVCD->iSubItem); CString strValue = m_table2.GetItemText(nItemIndex, nSubItemIndex); // 继承整行基础颜色,再根据子项内容修改 COLORREF crText = pLVCD->clrText; if (strValue == _T("F")) { crText = RGB(255, 0, 0); } pLVCD->clrText = crText; *pResult = CDRF_DODEFAULT; } }
额外注意事项
- 确保
m_table2控件已正确关联NM_CUSTOMDRAW消息到OnCustomdrawMyList函数(可通过ClassWizard添加消息映射)。 - 若只需针对整行判断(比如某列值为"F"时整行变色),可简化代码,直接在
CDDS_ITEMPREPAINT阶段获取对应列的文本进行判断,无需进入子项处理阶段。
内容的提问来源于stack exchange,提问作者Ben Affleck
相关产品推荐
相关产品推荐

