2013-03-15 2 views
0

У меня есть контроль ClistView в приложении MFC. Мне нужно покрасить некоторые предметы в соответствии с его содержанием. Например, если он начинается с «No Response to», мне нужно сделать его красным.ClistCtrl задает цвет элемента

До сих пор я пытался

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

Но это не работает. Цвет не меняется. Мне что-то не хватает или что-то не так?

+2

Я делал это с большим успехом в прошлом, но мои дни MFC давно позади меня. Попробуйте прочитать это и дать свой обработчик аналогичного кода: http://www.codeproject.com/Articles/79/Neat-Stuff-to-Do-in-List-Controls-Using-Custom-Dra – Chad

+0

Это проще сделать делать с CMFCListCtrl – sergiol

ответ

1

Этот код в простом примере приложения работал для меня. Элемент управления списком имеет два столбца и два элемента. Второй элемент, второй столбец имеет набор данных, равный 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; 
    } 
} 
+0

во время отладки, мой код только доходит до блока CDDS_ITEMPREPAINT. он никогда не переходит в блок (CDDS_ITEMPREPAINT | CDDS_SUBITEM). Когда я ставил pLVCD-> clrText = RGB (255, 0, 0); в блок CDDS_ITEMPREPAINT ничего не происходит. Кроме того, когда я использую SetTextColor (RGB (255,255,255)), чтобы все записи были красными, он остается черным. – gorkem

+0

Это сработало для меня! – Riskhan

2

Если у вас есть VS2008 SP1, гораздо проще использовать CMFCListCtrl - у него есть виртуальные функции, которые вы можете переопределить для установки цветов переднего плана и фона для каждой строки.