码迷,mamicode.com
首页 > Windows程序 > 详细

C# WinForm页面切换导致闪烁的解决方法

时间:2020-01-09 11:50:40      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:默认   描述   optimize   产生   大量   ble   sdk   样式   也会   

问题描述

界面上放置大量的控件(尤其是自定义控件)会导致在窗体加载时,速度变得缓慢;当切换页面时,也会时常产生闪烁的问题,非常影响用户体验。


解决方法

将此代码写在要解决闪烁问题的父窗体中:

 

1 protected override CreateParams CreateParams
2 {
3     get
4     {
5         CreateParams cp = base.CreateParams;
6         cp.ExStyle |= 0x02000000;
7         return cp;
8     }
9 }                

 

原理
Winform窗体程序在启动时绘制大量控件的时间开销非常大, 两个原因导致了这种闪烁(flicker):

当一个控件需要绘制时,Windows会向此窗体发送两条消息,第一条是:WM_ERASEBKGND,这条消息使得背景得以绘制,第二条消息是:WM_PAINT,使得前景被绘制,首先背景色是简单的,所以速度较快,前景色较为耗时(相对),所以就产生了这种闪烁现象,这是问题的根源,Winform为此提供了一个解决方案:双缓冲(OptimizedDoubleBuffer)。
当一个窗体包含许多控件的时候,需要大量的时间来进行绘制,尤其是默认属性的按钮控件。一旦你的窗体包含了50个(或更多)的控件,闪烁的问题就出现了。窗体类首先绘制背景色,打个比方,每个控件的背景色都形容为一个“坑”,那么当你使用透明色或者继承父类选项时,每个洞首先被绘制成白色,黑色,然后每个控件前景色被绘制(填坑),表面上看非常丑,并且没有现成的解决方案,DoubleBuffering也无法解决大量的控件闪烁问题。

在SDK头文件中有这样一个Windows样式:WS_EX_COMPOSITED,这个样式可使Windows Forms启用双缓冲于所有窗体以及其子控件,当然也就解决了上述问题。

C# WinForm页面切换导致闪烁的解决方法

标签:默认   描述   optimize   产生   大量   ble   sdk   样式   也会   

原文地址:https://www.cnblogs.com/ybqjymy/p/12170607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!