C#窗口闪烁问题解决
https://www.cnblogs.com/AndyDai/p/5203798.html
开发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 = };
Timer.Tick += new EventHandler(Timer_Tick);
base.Opacity = ;
Timer.Start();
} private void Timer_Tick(object sender, EventArgs e)
{
if (this.Opacity >= )
{
Timer.Stop();
}
else
{
base.Opacity += 0.2;
}
}
}
C#窗口闪烁问题解决的更多相关文章
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- 解决direct2d拖拽窗口闪烁
响应WM_ERASEBKGND,在OnEraseBkgnd()处返回FALSE,阻止GDI重绘客户区背景色,设置背景色的工作交给Direct2D在Render时设置,否则在Resize时会出现窗口闪烁 ...
- C# winfrom界面跳转闪烁问题解决方法
在窗体的构造函数中添加代码: SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, ...
- C#控件的闪烁问题解决方法总结
最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005.在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果. ...
- .net4.6版本前设置window子窗口位置主窗口闪烁
在安装了.net4.6的版本是不会出现该问题的,但是在4.6以下的版本会出现,当设置之窗体的left和top属性时,会让主窗体闪烁一下. 之前是在load事件下写的: child_window.loa ...
- angular.js ng-repeat渲染时出现闪烁问题解决
当我们前端运用到angular.js框架时,想必大家都会遇到一些坑.其中,我也来分享一个常见的angular.js渲染时出现的坑. 当我们进行页面渲染时,绑定表达式最开始会用{{data.name}} ...
- C#子窗体闪烁问题解决
在父窗体随意为之添加 protected override CreateParams CreateParams { get { XtraForm xa = _App.Framework.MainFor ...
- actionBar-进入界面闪烁问题解决
问题分析: 主要是因为在开启一个应用的时候,当前界面并不是第一界面,在它之前,还有一个界面启动了,这个界面的唯一目的就是启动主界面,它目的不是显示.虽然如此,但是呢,这个界面的theme因为没有做统一 ...
- MFC 窗口刷新防止闪烁方法
防止窗口闪烁的方法 1.将Invalidate()替换为InvalidateRect(). Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重 ...
随机推荐
- Dynamic CRM 2015学习笔记(6)没有足够的权限 - 您没有访问这些记录的权限。请联系 Microsoft Dynamics CRM 管理员
我们经常遇到下面这种问题:没有足够的权限 - 您没有访问这些记录的权限.请联系 Microsoft Dynamics CRM 管理员. 下面将详细介绍下如何解决这种问题:进不了CRM系统:进了CRM ...
- BUG关闭原因
已解决:缺陷已经修复. 重复缺陷:是指在系统里相同原因的缺陷已经被其他人报告.在此缺陷被作为重复缺陷返回时,先不要立即取消.必须等到核查修复后,才在系统里取消.这是因为有些缺陷被误认为是重复缺陷,实际 ...
- 洛谷P1173 [NOI2016]网格
这个码量绝对是业界大毒瘤...... 300行,6.5k,烦的要死...... 题意:给你一个网格图,里面有0或1.你需要把一些0换成1使得存在某两个0不四联通.输出最小的换的数量.无解-1. n,m ...
- 洛谷P4769 冒泡排序
n <= 60w,∑n <= 200w,1s. 解:首先有个全排列 + 树状数组的暴力. 然后有个没有任何规律的状压...首先我想的是按照大小顺序来放数,可以分为确定绝对位置和相对位置两种 ...
- python描述器
描述器定义 python中,一个类实现了__get__,__set__,__delete__,三个方法中的任何一个方法就是描述器,仅实现__get__方法就是非数据描述器,同时实现__get__,__ ...
- 解决在vue中axios请求超时的问题
查看更多精彩内容请访问我的新博客:https://www.cssge.com/ 自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们 ...
- 软件在 win7 上运行时显示乱码
一个用户反应后,我当时就蒙圈了,因为之前从未遇到过: 百度一下后,发现用户的这种情况比较特殊,从表面上看,[控制面板]和[注册表]相关项设置都正常,为什么还显示乱码呢? 到最后一步如果已经是(简体,中 ...
- python 二维数组读入
study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二维数组键盘输入 1 m = int( ...
- Day013--Python--内置函数一
一.作用域相关(2) 1. globals() 查看全局空间作用域中的内容. 函数会以字典的类型返回全部全局变量. 2. locals() 查看当前空间作用域中的内容. 函数以字典的类型返回当前位 ...
- ElasticSearch6.5.0 【script_lang not supported】
执行代码:[就是想根据条件更新]把品牌为LiNing的都改成Cat. UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.I ...