当前位置:首页 > Windows程序 > 正文

C#窗口闪烁问题解决

2024-03-31 Windows程序

开发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

Jm-杰米博客Jamie
草根站长的技术交流乐园!IT不会不要紧快来好好学习吧!
  • 20786文章总数
  • 7494588访问次数
  • 建站天数
  • 友情链接