ListCtrl的HeaderCtrl正常情况下是灰色背景及黑色的文字,如何在点击后1个item后,将其背景色改 为兰色,字符变成白色

解决方案 »

  1.   

    自绘。http://www.codeproject.com/listctrl/skinlist.asp
      

  2.   

    http://www.codeproject.com/listctrl/skinlist.asp
    这个例子搞的太复杂,我只是改变一下前景及背景色,不会那么复杂吧?!
      

  3.   

    有点麻烦
    需要重载OnNMCustomdraw
    然后定义一个SetColor方法,调用他设定前\背色,RedrawItems
      

  4.   

    ok1234567(ok1234567)大侠能否给点代码?
      

  5.   

    我用OnNMCustomdraw方法倒是可以到下面的item的前景及背景色可以任意改变,但就不知道如何改HeaderCtrl中的Item的前景及背景色
      

  6.   

    重新绘制表头,很麻烦的
    1、新建一个CHeaderCtrl的继承类,比如CColorHeaderCtrl
    2、在这个类中定义一个表头的结构数组:文字、格式、背景、前景、宽度等
    3、写一个方法:SetHeaderData(...),初始化表头数据
    4、重载DrawItem
    类似:
    void CColorHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    // TODO: Add your message handler code here and/or call default
    CDC   *pDC   =   new   CDC   ;   
    pDC->Attach(lpDrawItemStruct->hDC)   ;   
    CBrush   *pNewBrush   =   new   CBrush(RGB(255,0,0)); );//从定义数据中取
    CBrush   *pOldBrush   =   pDC->SelectObject(pNewBrush);
    pDC->Rectangle(&lpDrawItemStruct->rcItem) ; 
    pDC->SetBkMode(0);
    pDC->SetTextColor(RGB(255,255,255));
    pDC->DrawText("1234",&lpDrawItemStruct->rcItem,LVCFMT_LEFT);//内容从定义数据中取
    pDC->SelectObject(pOldBrush);
    pDC->Detach();   
    delete   pDC; 
    }
    5、在你的颜色列表类中子类化m_ColorHeader,形如:
    void CColorListCtrl::PreSubclassWindow() 
    {
    CListCtrl::PreSubclassWindow();
    m_ColorHeader.SubclassWindow( ::GetDlgItem(m_hWnd,0) );
    }6、在合适的地方,将m_ColorHeader中的Item定义为自绘制
    代码为:
    HDITEM       hdItem;
    hdItem.mask  =  HDI_FORMAT;   
    for(int i=0;   i<m_ColorHeader.GetItemCount(); i++)   
    {   
    m_ColorHeader.GetItem(i,&hdItem);   
    hdItem.fmt   |=   HDF_OWNERDRAW;   
    m_ColorHeader.SetItem(i,&hdItem); 
    }至此,你应该有了一个自定义的可以控制表头前、背景颜色的新 CColorListCtrl 类