请问怎么给TListView控件加上背景图片,而背景图片不会覆盖ListView的Item的图片和字体
如题 问题点数: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




