ClistCtrl 设置项目的颜色
Posted
技术标签:
【中文标题】ClistCtrl 设置项目的颜色【英文标题】:ClistCtrl set color of an item 【发布时间】:2013-03-15 14:12:26 【问题描述】:我的 MFC 应用程序中有 ClistView 控件。我需要根据其内容为某些项目着色。例如,如果它以“No Response to”开头,我需要将其设为红色。
到目前为止,我已经尝试过
BEGIN_MESSAGE_MAP(CMessageView, CListView)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,customDraw)
END_MESSAGE_MAP()
void CMessageView::Update()
CListCtrl& refCtrl = GetListCtrl();
refCtrl.InsertItem(LVIF_TEXT|LVIF_PARAM,0,CTime::GetCurrentTime().Format("%H:%M:%S"),0,0,0,42);
refCtrl.SetItemText(0,1,"some text");
refCtrl.SetItemText(0,2,"No response to open");
void CMessageView::customDraw(NMHDR * pNMHDR, LRESULT * pResult)
_ASSERTE(*pResult == 0);
NMLVCUSTOMDRAW * pnmlvcd = (NMLVCUSTOMDRAW *)pNMHDR;
DWORD dwDrawStage = pnmlvcd->nmcd.dwDrawStage;
BOOL bSubItem = dwDrawStage & CDDS_SUBITEM;
dwDrawStage &= ~CDDS_SUBITEM;
switch (dwDrawStage)
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
case CDDS_SUBITEM:
if(pnmlvcd->nmcd.lItemlParam == 42)
pnmlvcd->clrText = RGB(255,0,0);
*pResult = 0;
break;
default:
*pResult = 0;
break;
但它不起作用。颜色没有变化。我错过了什么或做错了什么?
【问题讨论】:
过去我在这方面取得了巨大成功,但我的 MFC 时代已经过去很久了。尝试阅读本文并为您的处理程序提供类似的代码:codeproject.com/Articles/79/… 使用 CMFCListCtrl 更容易做到 【参考方案1】:如果您有 VS2008 SP1,则改用 CMFCListCtrl
会更容易 - 它具有可以覆盖的虚函数来设置每行的前景色和背景色。
【讨论】:
【参考方案2】:这个简单示例应用程序中的代码对我有用。我的列表控件有两列和两个项目。第二个项目,第二列的项目数据设置为 42,在这种情况下,只有该特定子项目的文本变为红色。
void CMFCTestDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
// TODO: Add your control notification handler code here
*pResult = CDRF_DODEFAULT;
switch(pLVCD->nmcd.dwDrawStage)
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
if(1 == pLVCD->iSubItem)
if(pLVCD->nmcd.lItemlParam == 42)
pLVCD->clrText = RGB(255, 0, 0);
break;
【讨论】:
在调试时,我的代码只能走到 CDDS_ITEMPREPAINT 块。它永远不会进入 (CDDS_ITEMPREPAINT | CDDS_SUBITEM) 块。当我把 pLVCD->clrText = RGB(255, 0, 0);进入 CDDS_ITEMPREPAINT 块,没有任何反应。此外,当我使用 SetTextColor(RGB(255,255,255)) 使所有条目变为红色时,它保持黑色。以上是关于ClistCtrl 设置项目的颜色的主要内容,如果未能解决你的问题,请参考以下文章