Visual c++ ClistCtrl设置项目的颜色

Visual c++ ClistCtrl设置项目的颜色,visual-c++,mfc,visual-c++-2008,clistctrl,Visual C++,Mfc,Visual C++ 2008,Clistctrl,我的MFC应用程序中有ClistView控件。我需要根据内容给一些物品上色。例如,如果它以“无响应”开头,我需要将其变为红色 到目前为止,我已经试过了 BEGIN_MESSAGE_MAP(CMessageView, CListView) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,customDraw) END_MESSAGE_MAP() void CMessageView::Update() { CListCtrl& refCtrl = GetListCtrl()

我的MFC应用程序中有ClistView控件。我需要根据内容给一些物品上色。例如,如果它以“无响应”开头,我需要将其变为红色

到目前为止,我已经试过了

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;
    }
}
}

但它不起作用。颜色不变。我是否遗漏了什么或做错了什么?

如果您有VS2008 SP1,那么使用起来就容易多了-它具有虚拟函数,您可以覆盖这些函数来设置每行的前景色和背景色。

如果您有VS2008 SP1,相反,它更易于使用-它具有虚拟功能,您可以覆盖这些功能来设置每行的前景色和背景色。

这段代码在一个简单的示例应用程序中适用于我。我的列表控件有两列和两项。第二项,第二列的项数据设置为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;
   }
}
void CMFCTestDlg::OnNMCustomdrawList1(NMHDR*pNMHDR,LRESULT*pResult)
{
NMLVCUSTOMDRAW*pLVCD=重新解释铸件(pNMHDR);
//TODO:在此处添加控件通知处理程序代码
*pResult=CDRF_DODEFAULT;
开关(pLVCD->nmcd.dwDrawStage)
{
案例CDDS_预涂:
*PRESLT=CDRF\u NOTIFYITEMDRAW;
打破
案例CDDS\U项目预涂:
*pResult=CDRF\u NOTIFYSUBITEMDRAW;
打破
案例(CDDS_项目预涂| CDDS_子项目):
{
如果(1==pLVCD->iSubItem)
{
如果(pLVCD->nmcd.lItemlParam==42)
{
pLVCD->clrText=RGB(255,0,0);
}
}
}
打破
}
}

这个简单示例应用程序中的代码对我很有用。我的列表控件有两列和两项。第二项,第二列的项数据设置为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;
   }
}
void CMFCTestDlg::OnNMCustomdrawList1(NMHDR*pNMHDR,LRESULT*pResult)
{
NMLVCUSTOMDRAW*pLVCD=重新解释铸件(pNMHDR);
//TODO:在此处添加控件通知处理程序代码
*pResult=CDRF_DODEFAULT;
开关(pLVCD->nmcd.dwDrawStage)
{
案例CDDS_预涂:
*PRESLT=CDRF\u NOTIFYITEMDRAW;
打破
案例CDDS\U项目预涂:
*pResult=CDRF\u NOTIFYSUBITEMDRAW;
打破
案例(CDDS_项目预涂| CDDS_子项目):
{
如果(1==pLVCD->iSubItem)
{
如果(pLVCD->nmcd.lItemlParam==42)
{
pLVCD->clrText=RGB(255,0,0);
}
}
}
打破
}
}

我过去在这方面做得很成功,但我的MFC日子已经过去很久了。试着阅读本文,并给你的处理程序类似的代码:使用CMFCListCtrlI,这是一种更容易做到的方法。我在过去做过这件事,非常成功,但我的MFC时代已经过去很久了。尝试阅读本文并为处理程序提供类似的代码:这是使用CMFCListCtrl进行调试时更容易做到的方法,我的代码仅适用于CDDS_ITEMPREPAINT块。它永远不会进入(CDDS_itemprespaint | CDDS_子项)块。当我放置pLVCD->clrText=RGB(255,0,0);在CDDS_ITEMPREPAINT块中,什么都不会发生。另外,当我使用SetTextColor(RGB(255255255))将所有条目设置为红色时,它将保持黑色。在调试时,我的代码仅限于CDDS_itemprespaint块。它永远不会进入(CDDS_itemprespaint | CDDS_子项)块。当我放置pLVCD->clrText=RGB(255,0,0);在CDDS_ITEMPREPAINT块中,什么都不会发生。另外,当我使用SetTextColor(RGB(255255255))将所有条目设置为红色时,它将保持黑色。