2013-03-15 91 views
0

我的MFC應用程序中有ClistView控件。我需要根據其內容爲某些項目着色。例如,如果它以「沒有迴應」開頭,我需要把它變成紅色。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 2013-03-15 19:30:17

+0

這樣做更容易在調試時用CMFCListCtrl – sergiol 2016-12-19 11:31:16

回答

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 2013-03-18 08:33:58

+0

這對我有用! – Riskhan 2014-11-08 11:40:56

2

如果你有VS2008 SP1,使用CMFCListCtrl代替它會容易得多 - 它具有虛擬功能,你可以覆蓋它來設置每一行的前景色和背景色。

相關問題