指定改变ListCtrl中某一行的颜色

指定改变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;
    }
}


5.修改全部行的颜色。

void CXListCtrl::SetAllItemColor(/*DWORD iItem,COLORREF TextBkColor*/)
{
    COLORREF TextBkColor[2] ={RGB(255,0,0), RGB(0,255,0)};
    DWORD ncount = this->GetItemCount();

    for(DWORD numItem = 0; numItem < ncount ; numItem++)
    {
        MapItemColor.SetAt(numItem, TextBkColor[numItem%2]);
    }
    this->RedrawItems(0, ncount);
}

转自:http://cool.worm.blog.163.com/blog/static/64339006200911925824375/

ps:对原文有所修改

你可能感兴趣的:(指定改变ListCtrl中某一行的颜色)