问题:
使用TreeView控件,给Image绑定了一个ImageList,ImageList控件中有一套类似QQ的上线的彩色图标。现在要做到的效果是:在程序运行中动态改变结点的图标,把结点当前的彩色图标变成对应的灰色图标。
我现在已经可以用程序把彩色图标生成灰阶图(类似QQ的离线图标),也可以使用程序把ImageList的图标叠加另外一幅图(类似QQ的会议、吃饭等等的图标),但是如果修改结点对应的ImageList的索引的图标的话,其它使用了相同索引图标的结点也会跟着改变,这不符合我的要求。要求:
只使用一套彩色图标,怎样达到类似QQ的这种动态改变结点的图标,也就是说,利用这一套彩色图标来让结点的图标变成灰色以及叠加其它的图标,从而达到类似QQ上线、离线、忙等的图标效果。
使用TreeView控件,给Image绑定了一个ImageList,ImageList控件中有一套类似QQ的上线的彩色图标。现在要做到的效果是:在程序运行中动态改变结点的图标,把结点当前的彩色图标变成对应的灰色图标。
我现在已经可以用程序把彩色图标生成灰阶图(类似QQ的离线图标),也可以使用程序把ImageList的图标叠加另外一幅图(类似QQ的会议、吃饭等等的图标),但是如果修改结点对应的ImageList的索引的图标的话,其它使用了相同索引图标的结点也会跟着改变,这不符合我的要求。要求:
只使用一套彩色图标,怎样达到类似QQ的这种动态改变结点的图标,也就是说,利用这一套彩色图标来让结点的图标变成灰色以及叠加其它的图标,从而达到类似QQ上线、离线、忙等的图标效果。
设置TreeView的Images属性,然后根据实际情况设置节点的
ImageIndex//这个可以解决你的问题
同时也SelectedIndex和ImageIndex一致,以至在选中时图标不会改变。
用QQ来举例子:比如我的头像是一个企鹅,那么在ImageList控件中就只有一个彩色的企鹅,而没有离线(灰色的企鹅头像)、忙(彩色企鹅头像和其它图标叠加)的头像。我现在已经可以使用彩色的企鹅头像生成灰色的企鹅头像以及“彩色企鹅头像叠加其它图标的头像(例如企鹅头像下叠加一个时钟的图案)”,但是就是不想改变ImageIndex的索引号,因为这样做虽然简单,但是前期的准备工作却很复杂(需要在ImageList中添加所有彩色头像所对应的灰色头像及其它叠加的头像,可能我说的不是很清楚,你想想QQ的离线、上线、忙的图标就明白了。)
但我觉得解决问题的方法是添加所有头像到ImageList中
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分,所以你的给分太没有诚意了……
QQ 可以那样实现,是因为 QQ 对每个用户都有独立的图标。 你又想大家用统一的图标,又想每个人又各自的图标,你到底想干啥?什么叫每个用户都有独立的图标?除非QQ的好友列表的TREEVIEW是自己重新编写的,图标不是通过IMAGELIST来设置的。这样他就能够做到每个用户都有自己的独立的图标,而不影响其它的用户结点。
发表于: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、分数没问题,如果能够实现,给几百分都可以。
2.我现在有一个问题,我只出1块钱请人解决,但我却说如果解决了,1000万都可以。
2.我现在有一个问题,我只出1块钱请人解决,但我却说如果解决了,1000万都可以。
1、拜托你看懂我的帖子再说话;
2、分数很重要吗?和你这种人说话没意思。