日期:2014-05-17  浏览次数:21258 次

Winform使用背景图片时,上面的控件会一个个缓慢的显示出来
本帖最后由 mmruyue 于 2011-01-17 11:30:28 编辑
如下图,Panel上方了很多控件(Label/Button)。当没有使用背景时,所有控件一下子就显示出来了;当使用背景图片时,控件时一个接一个慢慢显示出来的。
各位有什么办法解决?谢谢。

[img=http://public.bay.livefilestore.com/y1piJDo3E0dSPItB2mMrCdVz-VAF9_FjAkMrygzcc_vTRMIU_OPKVq5sNqo4CKqlUnuhM_ezu0ABN2U0vbggMZRxw/1.jpg?psid=1][/img]
[img=http://public.bay.livefilestore.com/y1ph38kr-5hRp9Y9yESKuB-b3OpgykJy9YyAMsNZOuPDL67XAKxjfw2uqU3skl7OvHlyPXHswbQjIbhht7aNfdncw/2.jpg?psid=1][/img]
[img=http://public.bay.livefilestore.com/y1pJeFjLXBPdueVqc9btScKrPzgJMUUkp7Dt70szKpI6kdZDF_LKEBcR8AFZgNs-naXH16CRzZZ8Z0IDRoos60iTA/3.jpg?psid=1][/img]

------解决方案--------------------
跟Panel没关系
图片做背景,控件透明色,winform闪的就厉害,因为这些控件都是一个一个的重绘出来的。

系统自带的双缓冲 或者自己实现双缓冲都没用。双缓冲只能保证单个控件不闪(窗体上的GDI绘图,或者自定义控件)
想不闪只有所有控件都自己画在窗口上。但是那样付出和收获不成正比
------解决方案--------------------
public class MyPanel : Panel
{
    public MyPanel()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer
------解决方案--------------------
 ControlStyles.AllPaintingInWmPaint, true);            
    }
}


速度会比你原来的块,但也会刷。不过块一点。
------解决方案--------------------
在paint中绘制背景,并且使用局部更新,以跳过其他控件所在区域,这样就可以避免因为绘制图片导致其他控件也更新.
------解决方案--------------------
这种情况肯定会闪烁,除非用GDI+自己画图实现,
自定义Button类(自绘,定义点击事件等)
之前一个项目也遇到这种情况,一直闪,非常影响客户体验,后面改成自己画了