1. 程式人生 > >改變CListCtrl某行的顏色

改變CListCtrl某行的顏色

指定改變CListCtrl中某一行的顏色,比如說剛新增進去的一行,讓它改變顏色,這樣記錄多了,容易看到自己剛剛加如的行,方便操作可檢視,也可以讓新增和修改的記錄顯示不一樣的顏色,方便的多了,VC自帶的沒有這種功能。

1.首先從CListCtrl 繼承一個類,命名為CXListCtrl

在標頭檔案中加摸板

CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;

好在這裡查詢你的修改的顏色。

2.自己寫個訊息對映,可能新增不上,要自己寫。

BEGIN_MESSAGE_MAP(CXListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
//  ON_WM_SIZE()
END_MESSAGE_MAP()

OnNMCustomdraw 為實現函式。

3.寫OnNMCustomdraw函式。

void CXListCtrlNew::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: Add your control notification handler code here
    *pResult = CDRF_DODEFAULT;
    NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
    NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
    switch(lplvdr->nmcd.dwDrawStage)//判斷狀態
    {
        case CDDS_PREPAINT:
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
            break;
        }
        case CDDS_ITEMPREPAINT://如果為畫ITEM之前就要進行顏色的改變
        {
            COLORREF ItemColor;
            if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
            // 根據在 SetItemColor(DWORD iItem, COLORREF color) 設定的
            // ITEM號和COLORREF 在摸板中查詢,然後進行顏色賦值。
            {
                //lplvdr->clrText = RGB(0,0,0);//ItemColor;
                lplvdr->clrTextBk = ItemColor;
                *pResult = CDRF_DODEFAULT;
            }
        }
        break;
    }
}


4.修改指定一行的顏色。

void CXListCtrl::SetItemColor(DWORD iItem, COLORREF color)
{
    //    m_iCurrentItem = iItem;
    //    m_CurrentColor = color;

    MapItemColor.SetAt(iItem, color);//設定某行的顏色。
    this->RedrawItems(iItem, iItem);//重新染色

    //this->SetCheck(iItem,1);
    this->SetFocus();    //設定焦點
    UpdateWindow();
}


5.修改全部行的顏色。

void CXListCtrl::SetAllItemColor(DWORD iItem,COLORREF TextBkColor)
{
    //INT_PTR ncount = this->GetItemCount();
    if(iItem > 0)
    {
        for(DWORD numItem = 0; numItem < iItem ;numItem ++)
        {
            //iItem = i;
            MapItemColor.SetAt(numItem, TextBkColor);
            this->RedrawItems(numItem, numItem);
        }
    }

    return;

}