1. 程式人生 > >動態改變listctrl 單元格背景及文字顏色(非重寫控制元件)

動態改變listctrl 單元格背景及文字顏色(非重寫控制元件)

CListCtrl 類裡面沒有直接改變單元格背景及文字顏色的成員函式,只有改變整個背景的顏色。我有時候只是需要把某個單元格的顏色改變來突出顯示就可以了:

我們可以通過過載ListCtrl控制元件的Customdraw 訊息,然後在裡面寫一些程式碼就可以了;

void CGPRSDlg::OnNMCustomdrawListshow(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = CDRF_DODEFAULT;

    if ( CDDS_PREPAINT ==pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        // This is the notification message for an item. We'll request
        // notifications before each subitem's prepaint stage.
  
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
    {
        COLORREF clrNewTextColor, clrNewBkColor;
int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec );
CString strTemp=m_listshow.GetItemText(nItem,pLVCD->iSubItem ); 
switch(pLVCD->iSubItem)
{
         case 11:    
case 12:
case 13:     
case 14:     
case 15:      
         { 
             if(strcmp(strTemp,"ON")==0)
      {
               clrNewTextColor = RGB(0,255,0);
        clrNewBkColor = RGB(255,255,255);
      }
      if(strcmp(strTemp,"OFF")==0)
      {
                clrNewTextColor = RGB(122,122,122);
         clrNewBkColor = RGB(255,255,255);
      }
              pLVCD->clrText =clrNewTextColor;
       pLVCD->clrTextBk =clrNewBkColor;
       *pResult = CDRF_DODEFAULT;
       break;
   }    
default:
pLVCD->clrText = RGB(0,0,0);
pLVCD->clrTextBk = RGB(255,255,255);
*pResult = CDRF_DODEFAULT;
break;
    } 
}
上面的程式碼中pLVCD->nmcd.dwItemSpec : 意思是listctrl 第幾行的索引值;

pLVCD->iSubItem :意思是某行的某列的索引值,通過這兩個值我們就可以知道,現在要改的是哪個單元格了。

然後pLVCD->clrText 是這個單元格的文字顏色;

pLVCD->clrTextBk是這個單元格的背景顏色;

我們是如果這個是我們需要改的我們就給它一個新值,如果不是我們要改的我們就給他預設值。這樣就

可以改變我們的單元格的顏色了。

下面我們可以給一個實際的例子,比如我們的ListCtrl是一個顯示某臺裝置的引數的值,這些引數我們接收過來後,我們可以做一個判斷,如果某項引數超過我們設定的報警值我們可以改變它的顏色來突出顯示這個引數,這樣豈不更直觀;

。。。。。。

case 7:
      {
       if(strTemp>paravalue1 || strTemp<paravalue2)
       {
             clrNewTextColor = RGB(255,0,0);
               clrNewBkColor = RGB(255,255,255);
       }
       else
       {
              clrNewTextColor = RGB(0,0,0);
              clrNewBkColor = RGB(255,255,255);
       }
          pLVCD->clrText =clrNewTextColor;
           pLVCD->clrTextBk =clrNewBkColor;
        *pResult = CDRF_DODEFAULT;
             break;
      }

。。。。。。

當我們接受的一項引數在我們設定的報警值範圍我們就把這個引數用紅色字型顯示出來。Ok這樣就可以動態顯示了;如果覺得這樣還不方便,我們可以重寫CListCtrl類,然後裡面增加一個改變單元格顏色的成員函式,就可以更方便了;

如果大家有什麼更好的建議,大家共同商量