C#窗口闪烁问题解决
开发WinForm 措施时经常会遇到闪屏的问题,这会给用户造成很差的使用体验,所以必需妥善解决好这个问题。
首先,我们先要找出闪屏的原因,就我目前遇到的问题而言,其原因真是八门五花。
主要的原因有:使用了很多的组件导致加载迟缓,使用了性能差的组件(PictureBox、Button等)。
所以,岂论开发者的程度如何,微软给我们也挖了坑的。
对付控件太多造成的闪屏,其原因有两个:
1. 绘制控件时,Windows 会给控件发送两个动静。第一个是WM_ERASEBKGND动静,它会触发OnPaintBackground要领,绘制控件配景。
第二个是WM_PAINT动静,它会触发 OnPaint()要领,绘制控件界面。当绘制很慢的时候,会先看到配景,然后才看到界面,这样造成闪烁。
解决方案:在结构要领中设置 ControlStyles 的OptimizedDoubleBuffer 和AllPaintingInWmPaint为True,完全启用双缓冲。
启用双缓冲的首选要领是将该控件的 DoubleBuffered 属性设置为 true,这会孕育产生同样的功效,原因不细说了。
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
2. 有很多控件的窗体需要很永劫间来绘制。出格是在它使用性能很差的PictureBox、Button等时。一旦你加上50多个的控件,闪屏就开始变得明显了。
窗体会先绘制其自身配景,并在控件地址处所留下"洞"。这些"洞"凡是是白色的,当你使用Opacity 或Transparency是黑色的。
然后每个控件被绘制后,就填充在"洞"中。这种视觉效果是很丑恶的,而且在WinForm 中没有现成的解决方案。
双缓冲也不能解决它,因为它只适用于一个单一的控件,而不是一组复合控件。
解决方案:设置CreateParams的ExStyle为ExStyle 为 0x02000000 (WS_EX_COMPOSITED)。
设置了这个值之后XP(其他系统仿佛也可以,没有考证)会把窗体和它的子窗体都开启双缓冲。
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
这里有一些需要注意的处所:这种方法并不会加快绘制的过程。当产生绘制时,窗体只是勾留在不偏见的状态,,当绘制完成后就会在屏幕上弹出。
这时窗体的Opacity or TransparencyKey 是不会起感化的,窗体的轮廓是可见的,在绘制区域会呈现一个丑恶的黑色矩形框。
要解决这个问题,最好使用计时器来增加不透明度值到99%,以使其在绘制后可见,这样用户就不会看到黑色矩形了。
public partial class FormDemo : Form { private Timer Timer = null; public FormDemo() { InitializeComponent(); Timer = new Timer() { Interval = 100 }; Timer.Tick += new EventHandler(Timer_Tick); base.Opacity = 0; Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { if (this.Opacity >= 1) { Timer.Stop(); } else { base.Opacity += 0.2; } } }
先写这么多,慢慢增补吧
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/34092.html