CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

如何在LISTBOX里画出不同的图标?

楼主ppyy()2001-09-19 10:04:16 在 Delphi / VCL组件开发及应用 提问

有一个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

相关问题

  • listbox能否加图标
  • ???listBox加上小图标??!
  • listbox中能使用图标吗?
  • 在listBox中每项前加个图标
  • ListBox有没有办法显示图标吗
  • (急) 如何实现带图标的ListBox控件???
  • 怎么按不同文件显示不同的图标?怎么取得系统图标?请教
  • 这样的图标动画怎么做?
  • ※※征求图标、BUTTON的小图画!!
  • TTreeview如何为每一个节点指定不同的图标

关键词

  • 代码
  • 图标
  • listbox
  • getico
  • imagelist
  • chechy
  • bitmap
  • rect
  • tbitmap
  • 谢谢

得分解答快速导航

  • 帖主:ppyy
  • chechy

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo