如题,我想给CListCtrl的每一项设置不同的背景色,但好像CListCtrl类本身没提供这样的接口(只有设置整个List背景色的方法)。
请问这个需求要如何做?需要重写什么,如何重写,能否说具体一些?多谢了!

解决方案 »

  1.   

    自绘CListCtrl,重载虚函数DrawItem
      

  2.   

    http://blog.csdn.net/VisualEleven/archive/2010/10/18/5948057.aspx
      

  3.   


    感谢,颜色的问题用你blog里的方法基本上解决了,但是又引出了一个新问题能否再指导一下,因为我的CListCtrl原来是设置了LVS_EX_CHECKBOXES风格的,而现在自绘以后,每一个item之前的checkbox就没了,只是在item之前留了一个空位,而且去点击这个空位似乎也没有checkbox的效果。能否再请教一下如何保留原来的checkbox功能?多谢了
      

  4.   

    http://hi.baidu.com/550189285/blog/item/e92e7e2901f4f8f499250a58.html
    参考这个....
      

  5.   


    好的,矩形框我可以试着画一下,可是我更苦恼的是,现在好像点击这个区域,并没有体现出我原来针对于checkbox所做的功能(重写DrawItem只是重绘了吧,怎么会把checkbox的逻辑功能都覆盖了呢?不懂),即使我在这个区域贴了矩形框上去,那怎么保持原有的逻辑功能?
      

  6.   

    楼主,因为clistctrl类不能实现很多自定义的风格
    我建议你去codeproject上面,查看一个叫CGridCtrl
    的类,它几乎你实现每一个格子的自定义风格
    即省时又省力
      

  7.   

    楼主,简单的自绘,可以响应NM_CUSTOMDRAW就可以了,响应方法OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)里面,只需要判定行数,然后修改相关的颜色值就可以了。
    NMLVCUSTOMDRAW *pNMCD = reinterpret_cast<NMLVCUSTOMDRAW *>(pNMHDR);

    if (pNMCD->nmcd.dwDrawStage == CDDS_PREPAINT)
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
    {
                    if(奇数行)
                    {
                      pNMCD->clrTextBk = RGB(100,100,100);
                    }
                    else
                    {
                      pNMCD->clrTextBk = RGB(200,200,200);
                    }
    *pResult = CDRF_DODEFAULT;
    }