CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

请问怎么给TListView控件加上背景图片,而背景图片不会覆盖ListView的Item的图片和字体

楼主fshrq(我要有五粒星)2006-03-15 11:13:09 在 Delphi / VCL组件开发及应用 提问

如题 问题点数:20、回复次数:20Top

1 楼hahafan(注意!此人前途迷茫)回复于 2006-03-15 13:30:04 得分 20

在ListView的OnCustomDraw写代码,如:  
  Sender.Canvas.Brush.Bitmap   :=   ABitmap;  
  Sender.Canvas.FillRect(ARect);  
  Top

2 楼fshrq(我要有五粒星)回复于 2006-03-15 13:58:03 得分 0

可不可以详细些,怎样指定是那张背景图片Top

3 楼hahafan(注意!此人前途迷茫)回复于 2006-03-15 14:21:29 得分 0

Sender.Canvas.Brush.Bitmap   :=   ABitmap;-->这句话就是指定背景图片的  
  ABitmap可以使用下面语句创建来载入背景图片  
  ABitmap   :=   TBitmap.Create;  
  ABitmap.LoadFromFile(背景图片);  
  Top

4 楼fshrq(我要有五粒星)回复于 2006-03-15 15:07:38 得分 0

这样是可以了,不过好像很耗资源,鼠标放在ListView上就感觉到鼠标移动得慢了很多Top

5 楼hahafan(注意!此人前途迷茫)回复于 2006-03-15 15:11:34 得分 0

ABitmap   :=   TBitmap.Create;  
  ABitmap.LoadFromFile(背景图片);  
  这两句话不要放到OnCustomDraw中,放到其他的地方Top

6 楼fshrq(我要有五粒星)回复于 2006-03-15 15:29:10 得分 0

我放在其他地方,感觉差不多,鼠标的移动还是有问题。  
  还有一个问题是ListView的Item项内容会盖住背景图片,可不可以只在有图片和文字的地方盖住图片,其他的地方是透明的。  
  麻烦你指教一下我,谢谢。Top

7 楼fshrq(我要有五粒星)回复于 2006-03-15 15:59:15 得分 0

hahafan(注意!此人前途迷茫)  
  你有没有用QQ,可不可以在QQ上和你聊聊Top

8 楼hahafan(注意!此人前途迷茫)回复于 2006-03-15 17:35:08 得分 0

速度应该还是可以的,不知道你的OnCustomDraw是些什么代码?图片很大?  
  若文字和图标也要背景透明的话,那可能需要在OnCustomDrawItem自己画图标和文字了。  
  不好意思,公司不能聊天。Top

9 楼fshrq(我要有五粒星)回复于 2006-03-15 19:00:16 得分 0

在OnCustomDrawItem自己画图标和文字的代码你有没有,可不可以再发给我Top

10 楼hahafan(注意!此人前途迷茫)回复于 2006-03-16 09:27:43 得分 0

简单的写了一下,可根据需要修改  
  var  
      TextRect,  
      PicRect:   TRect;  
  begin  
      DefaultDraw   :=   False;  
      PicRect   :=   Item.DisplayRect(drIcon);  
      TextRect   :=   Item.DisplayRect(drLabel);  
      if   cdsSelected   in   State   then  
      begin  
          Sender.Canvas.Brush.Color   :=   clBtnFace;  
          Sender.Canvas.FillRect(Item.DisplayRect(drSelectBounds));  
      end  
      else  
          Sender.Canvas.Brush.Style   :=   bsClear;  
      ImageList1.Draw(Sender.Canvas,   (PicRect.Left   +   ImageList1.Width   div   2),   (PicRect.Top     +   ImageList1.Height   div   2),   Item.ImageIndex,   True);  
      Sender.Canvas.TextOut(TextRect.Left,   TextRect.Top,   Item.Caption);  
  end;  
  Top

11 楼fshrq(我要有五粒星)回复于 2006-03-16 10:15:09 得分 0

ImageList1.Draw(Sender.Canvas,   (PicRect.Left   +   ImageList1.Width   div   2),   (PicRect.Top     +   ImageList1.Height   div   2),   Item.ImageIndex,   True);  
  这句编译的时候出错,应该怎样改啊,我改成  
  ImageList1.Canvas.Draw((PicRect.Left   +   ImageList1.Width   div   2),   (PicRect.Top     +   ImageList1.Height   div   2),   Item.ImageIndex,   True);  
  提示Item.ImageIndex不是TGraphic类型  
   
  还有2个问题想请教  
  1.在win98下这样写背景会不会有死机或速度很慢的情况出现的。  
  2.我的ListView是做在主界面的,当在主界面打开一个formstyle为fsMDIForm时,ListView的部分会显示黑色,怎样解决,打开formstyle为fsNormal,showmodal就不会有这样现象。  
   
  请你帮帮我啊,谢谢Top

12 楼hahafan(注意!此人前途迷茫)回复于 2006-03-16 11:29:55 得分 0

报的啥错?  
  1.没有试过,你现在的速度如何?在98下应该差别不大。  
  2.不太了解什么情况,显示黑色可以试着刷新一下主界面。Top

13 楼fshrq(我要有五粒星)回复于 2006-03-16 12:52:24 得分 0

在Sender.Canvas后报Incompatible   types:'integer'   and   'TCanvas'  
  在ImageList1.Height   div   2)   后报Incompatible   types:'TCanvas'   and   'integer'  
   
  我把你写的ImageList1.Draw改为ImageList1.Canvas.Draw,不改提示没有Draw  
   
   
  ListView变黑色,是在哪里在刷新一下主界面,是在listview的oncustomdraw事件还是其他地方Top

14 楼hahafan(注意!此人前途迷茫)回复于 2006-03-16 13:36:22 得分 0

不知道你的代码是什么样的?上面的代码我试过是可以使用的。  
  刷新不要在oncustomdraw中,就在变黑的时候刷就行了,比如子窗口显示后。Top

15 楼fshrq(我要有五粒星)回复于 2006-03-16 15:24:28 得分 0

不好意思,你的代码没有错,刚才是我看错,改错代码了。  
   
  刷新是在子窗口显示后才刷不行,因为子窗口显示后已经把listview盖住了,已经看不到listview了,不用刷新了,现在看到listview变黑是子窗口打开过程还没有最大化的时候listview看到变黑,所以想再请教在什么时候刷新,而且你指的刷新是简单的listview.refresh,还是其他需写代码的刷新,应该是最后一个问题了,请再麻烦你了。Top

16 楼fshrq(我要有五粒星)回复于 2006-03-16 15:49:29 得分 0

现在和需要的效果已经还接近了,不过发现有2个显示的效果处理得不好  
  1.Item项的字比较多时不会换行,会和旁边项的字重叠。  
  2.鼠标移到Item的某项,这一项会有一个灰色的底色显示,它是整个Item项显示灰色。  
   
  以上2个问题是listview自画背景图片才会这样显示的,如果不自画背景图片,Item项的字体是可以自动换行的,而鼠标移到Item项,也只有图片和字的附近有灰色阴影,不会整个Item项都有灰色阴影的。  
   
  在drawitem事件应该怎样写代码处理到和listview不画背景图片时的效果一样  
  请再教我Top

17 楼hahafan(注意!此人前途迷茫)回复于 2006-03-16 18:00:55 得分 0

试试这个  
  var  
      DrawRect,  
      TextRect,  
      PicRect:   TRect;  
  begin  
      DefaultDraw   :=   False;  
      PicRect   :=   Item.DisplayRect(drIcon);  
      TextRect   :=   Item.DisplayRect(drLabel);  
      DrawRect.Left   :=   PicRect.Left   +   (PicRect.Right   -   PicRect.Left   -   ImageList1.Width)   div   2;  
      DrawRect.Top   :=   PicRect.Top     +   (PicRect.Bottom   -   PicRect.Top   -   ImageList1.Height)   div   2;  
      DrawRect.Right   :=   DrawRect.Left   +   ImageList1.Width;  
      DrawRect.Bottom   :=   DrawRect.Top   +   ImageList1.Height;  
      if   cdsSelected   in   State   then  
      begin  
          Sender.Canvas.Brush.Color   :=   clBtnFace;  
          if   Item.ImageIndex   >=   0   then  
              Sender.Canvas.FillRect(DrawRect);  
          if   Item.Caption   <>   ''   then  
              Sender.Canvas.FillRect(TextRect);  
          DrawText(Sender.Canvas.Handle,   PChar(Item.Caption),   -1,   TextRect,   DT_WORDBREAK   or   DT_LEFT);  
      end  
      else   begin  
          Sender.Canvas.Brush.Style   :=   bsClear;  
          DrawText(Sender.Canvas.Handle,   PChar(Item.Caption),   -1,   TextRect,   DT_LEFT   or   DT_END_ELLIPSIS);  
      end;  
      ImageList1.Draw(Sender.Canvas,   DrawRect.Left,   DrawRect.Top,   Item.ImageIndex,   True);  
  end;  
  Top

18 楼fshrq(我要有五粒星)回复于 2006-03-16 20:03:59 得分 0

谢谢你啊,现在基本的差不多了  
  小问题有1个,当Item是选中状态时,item图片周围是灰色底色,而图片是没色,可不可以反过来,图片周围是没色,而图片看上去有一层灰色的底色。  
  还有一个大问题是刷新问题,就是上面说的打开mdichild窗口listview就会显示黑色的问题,怎样解决。Top

19 楼fshrq(我要有五粒星)回复于 2006-03-20 22:39:50 得分 0

我结贴子了,我还在这个网址发了一张,你留个言,我把分也给你,谢谢  
  http://community.csdn.net/Expert/topic/4616/4616684.xml?temp=.9668848Top

20 楼hahafan(注意!此人前途迷茫)回复于 2006-03-21 09:19:34 得分 0

有几天没回这个帖子了,不好意思。  
  我只是实在觉得有些东西你可以自己搞定的,代码并不复杂。  
  不知道现在的效果怎么样啊?Top

相关问题

  • Listview控件字体改变颜色
  • 控件字体设置
  • 控件字体问题
  • listview控件?
  • 关于ListView控件。
  • listview控件问题
  • listview控件问题
  • ListView控件问题
  • ListView控件问题
  • ListView控件问题

关键词

  • 代码
  • 鼠标
  • 界面
  • picrect
  • imagelist1
  • 图片
  • abitmap
  • textrect
  • listview
  • canvas

得分解答快速导航

  • 帖主:fshrq
  • hahafan

相关链接

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

广告也精彩

反馈

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