如题。
我要在初始化的时候根据我的判断动态的改变某个添加进去的行的颜色。我知道在OnNMCustomdrawList事件中
if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )中可以改变行的颜色。不过这个只能是具体的固定行的颜色。我有试过加一个变量。然后在if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )根据这个变量的值来改变行的颜色。不过无效。codeproject里的例子太复杂了。然后还有一个问题是checkbox能否在其他的行添加。改了风格后是在第一行添加的。

解决方案 »

  1.   

    LZ还是根据实例代码看,自己探索比较麻烦。
    可以下这个例子看看:
    http://www.uipower.com/bbs/thread-97843-1-1.html
      

  2.   

    动态添加CheckBox的话,可以动态Create,然后MoveWindow等移动
      

  3.   

    1楼的我看过。那个例子很麻烦的。很难懂。2楼的如果用移动的方式貌似不可取吧。我那个是时常变换的。而且我要通过某一行checkbox的状态做操作的。
      

  4.   

    如果楼主是控件应用还是控件开发?控件应用就把说明看了,用了就OK了,别管实现了。
    如果控件开发的话,有XListControl这么好的例子,都说复杂,楼主干脆也别干了,没啥可研究的,搞研究的最怕的不是复杂,而是没方向,没东西可以研究。
      

  5.   

    1、改变颜色后用RedrawItems刷新。
    2、用LVS_EX_SUBITEMIMAGES扩展风格可以给每个子项设置图标,用两个图标分别表示check和uncheck状态,响应NM_CLICK通知用HitTest判断点击的位置更换图标。
      

  6.   

    谢谢满天星。1的话我不知道怎么得到项的时候就改变颜色啊。我本来想通过一个变量来判断的没有起到效果。如下:
    void OnNMCustomdrawList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
        NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
    COLORREF crText;
    if (bValidCert)
    {
    crText = RGB(255,0,0);
    }
    else
    {
    crText = RGB(0,255,0); }
         }
    }
    这是我添加项的时候的代码。不知道怎么来添加颜色。
    LVITEM item;
    item.iItem=i;
    item.iSubItem=0;
    item.mask=LVIF_TEXT;               
    item.pszText=strUser.GetBuffer(0);
    m_CertManList.SetItem(&item); item.iItem=i;
    item.iSubItem=1;
    item.mask=LVIF_TEXT;             
    item.pszText=strSn.GetBuffer(0);
    m_CertManList.SetItem(&item); item.iItem=i;
    item.iSubItem=2;
    item.mask=LVIF_TEXT;              
    item.pszText=strTime.GetBuffer(0);
    m_CertManList.SetItem(&item); item.iItem=i;
    item.iSubItem=3;
    item.mask=LVIF_TEXT;               
    item.pszText=strName.GetBuffer(0);
    m_CertManList.SetItem(&item);
    另外第二个的话我知道可以改变风格显示checkbox但是只是添加在行首怎么移动到行尾是个问题。
    谢谢
      

  7.   

    1、可以用SetItemData在Item中保存自定义信息,使用时用GetItemData取出。如果只需要一个颜色值可以直接将颜色值保存到Item里面,如果有多个颜色值或者还有其它数据,可以自定义一个结构体,用new分配,将指针保存在Item中。
    2、你没有注意看我前面的回复。LVS_EX_SUBITEMIMAGES扩展风格是让每个SubItem都具有一个图标,不是每个Item一个CheckBox。
      

  8.   

    感谢。第二个加图片的问题我会的。第一个我还是不明白你的意思哇。我查了下SetItemData是可以保存一个项的数据,关键是我不知道动态添加的时候直接把这行的颜色改了。就是说我获得数据然后判断要让这行变红就变红。要让这样变绿就变绿这样子。悟性不行。不好意思。
      

  9.   

    我也不明白你的意思。
    假如每行数据用同一种颜色显示,你可以直接把颜色值用SetItemData保存起来,在OnNMCustomdrawList中用GetItemData取出处理。在最初添加Item的时候就需要SetItemData,之后如果要修改Item的颜色时可以再次SetItemData,然后再刷新显示。
      

  10.   

    看这个网页吧,我复制其中11楼的代码,很快就解决了:http://topic.csdn.net/t/20051216/15/4463483.html
      

  11.   

    使用CGridCtrl 比较容易操作
    http://www.codeproject.com/KB/miscctrl/gridctrl.aspx
      

  12.   

    支持楼上的,那个类已经将clistctlr几乎所有功能都实现了,并且
    你在CGridCtrl 里面用 checkbox功能,都是现成的了。
    再扩展也很容易
      

  13.   

    使用别人封装的类很容易实现,codeproject上很多例子
      

  14.   

    你说的行都是列的意思吧?
    codeproject上的例子确是都实现了你的要求,你嫌麻烦可以直接重写他的相应类即可
      

  15.   

    解决问题了,给我一份代码谢谢了 [email protected]我也遇到这个问题好久了,只是本人水平太低