Winform使用背景图片时,上面的控件会一个个缓慢的显示出来

mmruyue 2011-01-17 11:27:56
如下图,Panel上方了很多控件(Label/Button)。当没有使用背景时,所有控件一下子就显示出来了;当使用背景图片时,控件时一个接一个慢慢显示出来的。
各位有什么办法解决?谢谢。



...全文
986 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
馨香紫韵 2013-04-26
  • 打赏
  • 举报
回复
引用 24 楼 HaveOneDream 的回复:
这种情况肯定会闪烁,除非用GDI+自己画图实现, 自定义Button类(自绘,定义点击事件等) 之前一个项目也遇到这种情况,一直闪,非常影响客户体验,后面改成自己画了
请问你是怎么画的,可以共享下经验吗?
joyxutan 2012-09-28
  • 打赏
  • 举报
回复
26楼,请说详细些
请叫我卷福 2011-10-15
  • 打赏
  • 举报
回复
zcdnh 2011-03-08
  • 打赏
  • 举报
回复
这个很简单的。首先要用双缓存。然后把控件重绘去掉。不让控件重绘就好了
mmruyue 2011-01-20
  • 打赏
  • 举报
回复
多谢各位。综合各种意见,唯一的根本解决方法就是在paint()中自己画。
正如jiabiao113所说,这个成本太高,暂时先采取压缩合并背景图片稍稍优化的方法。
HaveOneDream 2011-01-20
  • 打赏
  • 举报
回复
这种情况肯定会闪烁,除非用GDI+自己画图实现,
自定义Button类(自绘,定义点击事件等)
之前一个项目也遇到这种情况,一直闪,非常影响客户体验,后面改成自己画了
KissXYL 2011-01-19
  • 打赏
  • 举报
回复
public class MyPanel : Panel
{
public MyPanel()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer| ControlStyles.AllPaintingInWmPaint, true);
}
}


速度会比你原来的块,但也会刷。不过块一点。
colorall 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dylike 的回复:]
在paint中绘制背景,并且使用局部更新,以跳过其他控件所在区域,这样就可以避免因为绘制图片导致其他控件也更新.
[/Quote]

22++
mmruyue 2011-01-19
  • 打赏
  • 举报
回复
KissXYL,
我把代码放这里,请帮忙看看。谢谢
http://cid-02e6bed2f6a81833.office.live.com/self.aspx/.Public/BackgroundImage.rar
[Quote=引用 18 楼 kissxyl 的回复:]

没办法,专门做例子。无法重现。
[/Quote]
KissXYL 2011-01-19
  • 打赏
  • 举报
回复
没办法,专门做例子。无法重现。
csproj 2011-01-19
  • 打赏
  • 举报
回复
跟Panel没关系
图片做背景,控件透明色,winform闪的就厉害,因为这些控件都是一个一个的重绘出来的。

系统自带的双缓冲 或者自己实现双缓冲都没用。双缓冲只能保证单个控件不闪(窗体上的GDI绘图,或者自定义控件)
想不闪只有所有控件都自己画在窗口上。但是那样付出和收获不成正比
garfieldzf 2011-01-19
  • 打赏
  • 举报
回复
双缓冲
KissXYL 2011-01-19
  • 打赏
  • 举报
回复
使用双环冲绘图
mmruyue 2011-01-19
  • 打赏
  • 举报
回复
跑题了,不是Panel的问题。即使没有Panel,直接在form上放很多控件也会有问题。

对了,这个背景图片比较大,1024*768,40k
dylike 2011-01-19
  • 打赏
  • 举报
回复
在paint中绘制背景,并且使用局部更新,以跳过其他控件所在区域,这样就可以避免因为绘制图片导致其他控件也更新.
gentlesir81 2011-01-19
  • 打赏
  • 举报
回复
我觉得用foreath 用Console类应该好做,不管panel有多少个.

Console类?no GUI?
禁用F3 2011-01-18
  • 打赏
  • 举报
回复
我觉得用foreath 用Console类应该好做,不管panel有多少个
thisiscandy 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangglemu 的回复:]
这是另一位网友解决PanelBug的方法:
............都是panel惹的祸,把所有继承自panel的控件全改为继承自Control,画面中所有的panel控件全改为Control。现在基本不闪了!只是在IDE里的设计时没法往panel里拖控件了,只能在代码里写。鱼与熊掌不可兼得阿!
[/Quote]
明显可以拖啊 怎么不能拖?
哥本哈根 2011-01-17
  • 打赏
  • 举报
回复
学习一下...也遇到了这个问题
wuyq11 2011-01-17
  • 打赏
  • 举报
回复
this.DoubleBuffered = true;

Label[] arrLabel = new Label[1000];

this.panel1.SuspendLayout();
for (int i = 0; i < 1000; i++)
{
arrLabel[i] = new Label();
arrLabel[i].Text = i.ToString();
}
this.panel1.Controls.AddRange(arrLabel);
this.panel1.ResumeLayout();
加载更多回复(6)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧