问题:   
    使用TreeView控件,给Image绑定了一个ImageList,ImageList控件中有一套类似QQ的上线的彩色图标。现在要做到的效果是:在程序运行中动态改变结点的图标,把结点当前的彩色图标变成对应的灰色图标。
    我现在已经可以用程序把彩色图标生成灰阶图(类似QQ的离线图标),也可以使用程序把ImageList的图标叠加另外一幅图(类似QQ的会议、吃饭等等的图标),但是如果修改结点对应的ImageList的索引的图标的话,其它使用了相同索引图标的结点也会跟着改变,这不符合我的要求。要求:
    只使用一套彩色图标,怎样达到类似QQ的这种动态改变结点的图标,也就是说,利用这一套彩色图标来让结点的图标变成灰色以及叠加其它的图标,从而达到类似QQ上线、离线、忙等的图标效果。

解决方案 »

  1.   

    但是如果修改结点对应的ImageList的索引的图标的话,其它使用了相同索引图标的结点也会跟着改变,这不符合我的要求。 
    设置TreeView的Images属性,然后根据实际情况设置节点的
    ImageIndex//这个可以解决你的问题
    同时也SelectedIndex和ImageIndex一致,以至在选中时图标不会改变。
      

  2.   

    楼上的请看清楚我的问题和要求。
    用QQ来举例子:比如我的头像是一个企鹅,那么在ImageList控件中就只有一个彩色的企鹅,而没有离线(灰色的企鹅头像)、忙(彩色企鹅头像和其它图标叠加)的头像。我现在已经可以使用彩色的企鹅头像生成灰色的企鹅头像以及“彩色企鹅头像叠加其它图标的头像(例如企鹅头像下叠加一个时钟的图案)”,但是就是不想改变ImageIndex的索引号,因为这样做虽然简单,但是前期的准备工作却很复杂(需要在ImageList中添加所有彩色头像所对应的灰色头像及其它叠加的头像,可能我说的不是很清楚,你想想QQ的离线、上线、忙的图标就明白了。)
      

  3.   

    不太明白问题
    但我觉得解决问题的方法是添加所有头像到ImageList中
      

  4.   

    QQ 可以那样实现,是因为 QQ 对每个用户都有独立的图标。 你又想大家用统一的图标,又想每个人又各自的图标,你到底想干啥?
      

  5.   

    下面代码可以转换图标: procedure   TForm1.Button3Click(Sender:   TObject);   
      var   
          P:   PByteArray;   
          x,   y:   Integer;   
          Gray:   Integer;   
          Bmp:   TBitmap;   
      begin   
          Bmp   :=   TBitmap.Create;   
          Bmp.Assign(Image1.Picture.Bitmap);   
          Bmp.PixelFormat   :=   pf24bit;   
          for   y   :=   0   to   Bmp.Height   -   1   do   
          begin   
              P   :=   Bmp.ScanLine[y];   
              for   x   :=   0   to   Bmp.Width   -   1   do   
              begin   
                  Gray   :=   (P[3*x+2]   +   P[3*x+1]   +   P[3*x])   div   3;   
                  P[3*x+2]   :=   Byte(Gray);   
                  P[3*x+1]   :=   Byte(Gray);   
                  P[3*x]   :=   Byte(Gray);   
              end;   
          end;   
          Canvas.Draw(0,   0,   Bmp);   
          Bmp.Free;   
      end; 
    我说一下:你应该看看这里http://community.csdn.net/help/GetUsablePoint.htm1:每天只要发布帖子就可以获得30个可用分。所以你这个贴子虽然是50分实际你只付出了20分,所以你的给分太没有诚意了……
      

  6.   

    用fctreeview控件也可以而显示图片 
      

  7.   

    发表于:2008-06-06 23:19:104楼 得分:0
    QQ 可以那样实现,是因为 QQ 对每个用户都有独立的图标。 你又想大家用统一的图标,又想每个人又各自的图标,你到底想干啥?什么叫每个用户都有独立的图标?除非QQ的好友列表的TREEVIEW是自己重新编写的,图标不是通过IMAGELIST来设置的。这样他就能够做到每个用户都有自己的独立的图标,而不影响其它的用户结点。
      

  8.   

    *
    发表于:2008-06-07 09:28:545楼 得分:0
    下面代码可以转换图标:procedure  TForm1.Button3Click(Sender:  TObject); 
      var 
          P:  PByteArray; 
          x,  y:  Integer; 
          Gray:  Integer; 
          Bmp:  TBitmap; 
      begin 
          Bmp  :=  TBitmap.Create; 
          Bmp.Assign(Image1.Picture.Bitmap); 
          Bmp.PixelFormat  :=  pf24bit; 
          for  y  :=  0  to  Bmp.Height  -  1  do 
          begin 
              P  :=  Bmp.ScanLine[y]; 
              for  x  :=  0  to  Bmp.Width  -  1  do 
              begin 
                  Gray  :=  (P[3*x+2]  +  P[3*x+1]  +  P[3*x])  div  3; 
                  P[3*x+2]  :=  Byte(Gray); 
                  P[3*x+1]  :=  Byte(Gray); 
                  P[3*x]  :=  Byte(Gray); 
              end; 
          end; 
          Canvas.Draw(0,  0,  Bmp); 
          Bmp.Free; 
      end;
    我说一下:你应该看看这里http://community.csdn.net/help/GetUsablePoint.htm1:每天只要发布帖子就可以获得30个可用分。所以你这个贴子虽然是50分实际你只付出了20分,所以你的给分太没有诚意了……1、我在前面已经说了,我已经可以通过程序来实现灰阶图的转换了,所以你贴的那段代码没用;
    2、分数没问题,如果能够实现,给几百分都可以。
      

  9.   

    1.你是不会动态使用ImageList所导致。
    2.我现在有一个问题,我只出1块钱请人解决,但我却说如果解决了,1000万都可以。
      

  10.   

    1.你是不会动态使用ImageList所导致。
    2.我现在有一个问题,我只出1块钱请人解决,但我却说如果解决了,1000万都可以。
    1、拜托你看懂我的帖子再说话;
    2、分数很重要吗?和你这种人说话没意思。