是不是.net的bug? 透明控件在有背景图片的窗体上重画效率极差!mdi时透明控件不能生效

steeven 2003-10-28 01:44:41
如果窗体里面有背景图片:
1. 如果窗体是MDI属性,所有控件的背景颜色是窗体的背景颜色,不透明
2. 如果不是MDI, 颜色为Color.Transparent的控件会正常透明,但是如果有窗口
在上面拖动引发重画时,慢的出奇!2.4G CPU,1G内存居然还看出很明显的重画方块,并且CPU满.

经过摸索,绘制有背景图片的透明控件还是很简单的:
1. 窗体不能是MDI
2. 控件颜色要设定为Web下面的Tranparent, 也就是Color.Transparent
3. 一些没有底色的控件:Link, Label之类的不用设定背景色

正在做类似应用的请进来交流一下~~
...全文
96 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
EdwarddotNet 2003-10-30
UP 楼主

同样关于透明的问题
如何设置图片中的某个颜色为透明色,然后将图片的不透明部分画在控件表面,而透明部分透明???
  • 打赏
  • 举报
回复
steeven 2003-10-29
注意上面的假透明控件还不能移动,要移动道理差不多.
  • 打赏
  • 举报
回复
steeven 2003-10-29
解决了,解决了~~~

窗体在重画每个透明控件的时候都会调用容器(这里是Form)的OnPaintBackground方法来重画屁股下面的东西,然后再画自己的文本之类的.虽然指定了要重画的区域,但是跟重画整个背景用的时间一样.这样屏幕上有10个透明控件就相当于重画整个背景图片10遍.

那么就要想办法提高重画某个背景的速度,手工调用Graphics.DrawImage.这个方法支持画图片的指定区域到指定位置.实际运行下来发现这个鸟方法速度跟重画整个图片一样,看样OnPaintBackground是被这个方法坑了.

这样要自己想算法来加速重画指定区域,太烦,搞不定.不透明的控件重画为什么很快呢?
因为用了高露洁...不对,因为不透明,不需要重画背景.那么我们要透明的东西也不透明?不对,不透明还搞个P啊,应该根据控件在屏幕上的位置计算出自己的背景图片,这样重画就嗖嗖嗖,不用CPU...

//在FormLoad里面调用fillBackGroundImage(this,0,0)重画所有Panel和和Panel里面的LinkLabel

private void fillBackGroundImage(Control parent,int x, int y)
{
foreach(Control ctl in parent.Controls)
{
if (!ctl.Visible) continue;
if (ctl is LinkLabel || ctl is Panel){
Bitmap bmp = new Bitmap(ctl.Width,ctl.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(this.BackgroundImage,ctl.DisplayRectangle,
ctl.Left+x,ctl.Top + y,ctl.Width,ctl.Height,
GraphicsUnit.Pixel);
ctl.BackgroundImage = bmp;
}
if (ctl is Panel)
fillBackGroundImage(ctl,x+ctl.Left,y+ctl.Top);
}
}

为什么不能给自己加粪啊,stupid CSDN!
  • 打赏
  • 举报
回复
gordenfl 2003-10-28
我也遇到过这种问题!
  • 打赏
  • 举报
回复
blp 2003-10-28
我也帮你up一下
  • 打赏
  • 举报
回复
softye 2003-10-28
帮你UP
  • 打赏
  • 举报
回复
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2003-10-28 01:44
社区公告

让您成为最强悍的C#开发者