问题描述

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

解决方法

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

  protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}

  

原理

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

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

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

最新文章

  1. DOM相关属性,方法,兼容性问题处理小析
  2. VS 2010 问题集锦
  3. java 线程的终止与线程中断
  4. Android Glide数据更新及内存缓存、硬盘缓存清理
  5. MergeSort(归并排序)算法Java实现
  6. 36、Android Bitmap 全面解析
  7. 正则化—Java中Split函数的用法技巧_(转载修改)
  8. shiro认证
  9. Android 之 Spinner
  10. 批标准化(Batch Norm)
  11. 解决DOS批处理中一个困扰我几十个月的编码问题
  12. 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)
  13. DNS域名解析过程,域名的认识
  14. springboot集成mybatis源码分析(一)
  15. SQL记录-PLSQL基本语法与数据类型
  16. js中switch/case分支的值可以是变量或表达式
  17. 字符串经过base64编码后的长度与原字符串的长度是什么关系呀?
  18. 【bzoj2754】【scoi2012】喵星球上的点名
  19. jQuery弹出层效果
  20. Eclipse中Tomcat Server启动后马上又自动停止报错Address已经使用8005端口 Can't assign requested address (Bind failed)

热门文章

  1. 06: dorpzone上传下载
  2. RAFT实践
  3. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题
  4. Codeforces 839B Game of the Rows - 贪心
  5. ERROR: please install the following Perl modules before executing ./mysql_install_db
  6. EMMC 介绍【转】
  7. 修改sepolicy后编译出现‘Error while expanding policy’【转】
  8. 数论+矩阵快速幂|斐波那契|2014年蓝桥杯A组9-fishers
  9. Spring Boot源码分析
  10. windows下使用gvim不支持python3.6问题解决