如何在LISTBOX里画出不同的图标?
有一个LISTVIEW,ITEM是文件名。有一个IMAGELIST和一个LISTBOX,有一个函数GetIco,这个函数的功能就是获取指定文件的图标并把这个图标添加到IMAGELIST里。。。然后在LISTBOX里把这个图标画出来,详细代码:
for i:=0 to ListView1.Items.Count-1 do
begin
ImageList1.Clear;
GetIco(ListView1.Items[i].Caption);//得到指定文件的图标并把图标添加到IMAGELIST里
ListBox1.Item.Add( ListView1.Items[i].Caption);
end;
结果在程序运行中我发现一个问题,就是最后添加到LISTBOX里的ITEM前面画出的图标都是一样的,经过我仔细分析,发现每执行一次ListBox1.Item.Add,结果整个LISTBOX好象都要重画。。。结果导致了这样的后果。。。。
我想要的结果就是添加到LISTBOX里的ITEM都要是自己的图标,请问怎么解决?这个问题昨天我花了1个多小时还没有搞定。。。
问题点数:70、回复次数:23Top
1 楼chechy(www.qdocuments.net)回复于 2001-09-19 10:12:44 得分 0
将ListBox的Style设为lbOwnerDrawFixed,然后再OnDrawItem事件中画。Top
2 楼wwwxxx(wwwxxx)回复于 2001-09-19 10:18:57 得分 0
同样意见。Top
3 楼ppyy()回复于 2001-09-19 10:20:28 得分 0
老兄,我试过啊,还是不行。我现在问题不是画不出来图标,而是画出来的图标都是一样的。请仔细点看我的问题描述,OK?谢谢Top
4 楼ppyy()回复于 2001-09-19 10:32:23 得分 0
upTop
5 楼chechy(www.qdocuments.net)回复于 2001-09-19 10:35:05 得分 70
随便写了一些代码,由于没有考虑State,所以出来的结果比较难看,但是基本符合你的需要。
代码没有效率,所以还需要优化一下。另,我的ImageList的Width是16。
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
a: TBitmap;
b, c: TRect;
begin
a := TBitmap.Create;
try
ImageList1.GetBitmap(Index, a);
b := classes.Rect(0, 0, 16, 16);
c := classes.Rect(0, Rect.Top, 16, Rect.Bottom);
ListBox1.Canvas.CopyRect(c, a.Canvas, b);
ListBox1.Canvas.TextOut(18, Rect.Top, ListBox1.Items[Index]);
finally
a.Free;
end;
end;
Top
6 楼ppyy()回复于 2001-09-19 10:45:53 得分 0
还有谁有更好的解决办法吗?Top
7 楼ppyy()回复于 2001-09-19 10:51:27 得分 0
upTop
8 楼wangzh(独孤求问)回复于 2001-09-19 11:05:01 得分 0
你能确定GetIco(ListView1.Items[i].Caption)的图标全都不一样吗?
问题可能出在这里。你先别动态为IMGLIST赋值,选几个不一样的图标。看看行不行。
如果行GetIco可能有问题。Top
9 楼ppyy()回复于 2001-09-19 11:18:34 得分 0
upTop
10 楼ppyy()回复于 2001-09-19 15:30:27 得分 0
TO wangzh(独孤求问):GETICO没有问题,我测试过的。。。取得的图标都是不一样的。。。。
TO chechy(chechy):你的方法我试过了,还是不行,画出来的还是样。。。。
我发现LISTBOX每执行一次ListBox.Items.Add('test');就用当前IMAGELIST里的指定图标把所有的ITEM全部重新画了一遍,所以造成这种结果。。。
高手,快来吧。。。。Top
11 楼chechy(www.qdocuments.net)回复于 2001-09-19 15:38:56 得分 0
重化是没有错。但是我的代码,重绘是没有问题的啊。我刚才试过了。你确认ListBox的Style是OwnerDraw吗?当然我没有用GetICO,我的IMagelist中的图是固定的。Top
12 楼yypp(fly)回复于 2001-09-19 15:48:24 得分 0
我当然确定啊
不然的话图标是画不出来的
如果你方便的话,把你的测试代码发到我的信箱?
bugbox@263.net 谢谢Top
13 楼pandazy(小熊)回复于 2001-09-19 15:53:53 得分 0
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect:TRect;State: TOwnerDrawState);
var
Bitmap: TBitmap; { temporary variable for the item抯 bitmap }
Offset: Integer; { text offset width }
begin
with (Control as TListBox).Canvas do { draw on control canvas, not on the form }
begin
FillRect(Rect); { clear the rectangle }
Offset := 2; { provide default offset }
Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]); { get the bitmap }
if Bitmap <> nil then
begin
BrushCopy(Bounds(Rect.Left + 2, Rect.Top, Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); {render bitmap}
Offset := Bitmap.width + 6; { add four pixels between bitmap and text}
end;
TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index]) { display the text }
end;
end;Top
14 楼pandazy(小熊)回复于 2001-09-19 15:54:32 得分 0
这段帮助代码写得不是很清楚吗?Top
15 楼yypp(fly)回复于 2001-09-19 15:57:49 得分 0
to pandazy(小熊) :你的代码和上面还是差不多啊,哎~~等我回去测试吧。。。不过我想还是不能成功的。。。Top
16 楼chechy(www.qdocuments.net)回复于 2001-09-19 15:58:47 得分 0
发了,请查收。Top
17 楼yypp(fly)回复于 2001-09-19 16:01:51 得分 0
TO chechy(chechy):没有收到,麻烦你再发到snow@21cn.com一次,谢谢Top
18 楼yypp(fly)回复于 2001-09-19 16:06:22 得分 0
没有收到啊
麻烦你再发到 snow@21cn.com一次!谢谢Top
19 楼chechy(www.qdocuments.net)回复于 2001-09-19 16:10:39 得分 0
又发了一遍。Top
20 楼dsa(我爱学英语)回复于 2001-09-19 17:05:00 得分 0
gzTop
21 楼zenartus(投入者)回复于 2001-09-19 17:47:54 得分 0
gz,gz
up,upTop
22 楼haodaniu(大牛)回复于 2001-09-19 17:58:14 得分 0
首先设置为ownerdraw,然后在向imagelist中加入图标,最后在DrawItem中画imagelist中的图标到listbox
Top
23 楼ppyy()回复于 2001-09-19 22:14:58 得分 0
TO CHECHY,谢谢,我已经搞定了,开始的错误原因在于我使用同一个IMAGELIST画了两个LISTBOX的ITEM,所以出现错误。。分数给你加上:)Top




