WinForm Flicker闪屏解决方案
开发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;
}
}
}
先写这么多,慢慢补充吧!
WinForm Flicker闪屏解决方案的更多相关文章
- C# Winform Cef 闪屏
C# Winform Cef 闪黑屏 CefSettings cs = new CefSettings(); cs.CefCommandLineArgs.Add(");//禁用GPU Cef ...
- ios 点击失效、闪屏问题解决方案
一.点击失效 描述:将点击事件(click)委派在document或者body上,且目标元素为默认不可点击的元素时(非<a>. <button>而是<span>等) ...
- mfc static控件 视频播放 闪屏问题 解决方案
方案1: 我昨天刚在csdn上解决了这个问题,不是双缓冲和WS_CLIPCHILDREN还有背景擦出什么的问题,就是在你重画的时候要去掉这些控件(按钮什么的)区域, 闪屏是因为窗口大小发生改变时,由于 ...
- winform 添加背景图 闪屏问题解决
winform中只要添加了背景图片资源,窗体加载显示的时候就会出现不停的闪屏操作,网上找了很多方法,效果都不明显: 然后自己观察和思路:看窗体的加载过程,当有背景图的时候,首先出来的是背景图,之后背景 ...
- Ubuntu14.04 Y460闪屏问题解决方案
我的笔记本是联想Y460,安装了Ubuntu之后发现屏幕闪烁移位,而且在使用IDE的时候出现无法输入中文等问题,其实是显卡驱动的问题,N卡官网给的驱动不好用,尝试使用大黄蜂 参考:https://wi ...
- winform MDI子窗口闪动问题(本人测试100%有效解决闪屏问题)
将下面的代码随便放到主窗体的任何一个地方 protected override CreateParams CreateParams //解决MDI闪屏 { get { CreateParams cp ...
- MFC框架下Opengl窗口闪屏问题解决方案
转自https://blog.csdn.net/niusiqiang/article/details/43116153 虽然启用了双缓冲,但是仍然会出闪屏的情况,这是由于OpenGL自己有刷新背景的函 ...
- 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口
在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...
- jquery mobile 转场闪屏的解决
jqm转场闪屏是用phonegap生成apk非常容易遇到的问题,暂时貌似还是没有完美的解决方案,网上暂时有一些方案,个人都尝试了一下发现还是改背景比较有效,总结如下: 改变默认css文件: .ui- ...
随机推荐
- NiceFish的ERROR in AppModule is not an NgModule问题
大漠老师的angular2新手教程项目,nicefish刚开始下下来运行ng serve --prod --aot 是 出现ERROR in AppModule is not an NgModule ...
- lightoj1213推公式
很容易推出来的公式ans=n^(k-1)*k*sum 然后快速幂就好了 #include<map> #include<set> #include<cmath> #i ...
- HyperV创建NAT网络
创建NAT内部网络,使用PowerShell完成. https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/user-gu ...
- SmsUtils 发送短信
import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import j ...
- Eclipse中Preference打开后找不到Server项解决方案。
该解决方案是假设你已经安装好了JDK,tomcat,eclipse,突然在Eclipse的配置时找不到选择菜单栏中的window——preferences-server——runtime enviro ...
- uva-11020-平衡树
题目链接https://vjudge.net/problem/UVA-11020 白书例题,依次给出n个点的坐标,定义一个点为优势点当且仅当这个点的左下方区域不包含任何点(但可以与之完全重合):求每加 ...
- 再论typedef
typedef 定义(或者叫重命名)类型而不是变量 1.类型是一个数据模板,变量是一个实在的数据.类型是不占内存的,而变量是占内存的. 2.面向对象的语言中:类型的类class,变量就是对象. #in ...
- 不安装APK直接启动应用
相信这样一个问题,大家都不会陌生, “有什么的方法可以使Android的程序APK不用安装,而能够直接启动”. 发现最后的结局都是不能实现这个美好的愿望,而腾讯Android手机游戏平台却又能实现这个 ...
- 从零开始编写深度学习库(五)Eigen Tensor学习笔记2.0
1.extract_image_patches函数的使用: 假设Eigen::Tensor形状为(3,8,8,9),现在要对第二维.第三维根据size大小为(2,2),stride=(2,2),那么如 ...
- 解放内存之搭建自己的 R Server
学校的课五门有四门需要跑R程序,有一些长长长的代码实在是占用了太多的内存,果断决定搭个R的服务器放着自己跑. 愉快的是,R studio server 的搭建真心简单快捷~这个从前被我忽略的东东终于排 ...