博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winform窗体闪烁问题解决
阅读量:5055 次
发布时间:2019-06-12

本文共 879 字,大约阅读时间需要 2 分钟。

问题描述

在项目中因为不得不实现美工的界面要求,使用了大量的panel来隐藏控件的某些区域(对用户隐藏),在页面切换过程中会产生闪烁的问题,影响整体美观。虽不影响使用,但非常恼人。

 

 

解决方法

已经找到永久解决此问题的方法,在多个窗体,多个页面中测试通过,放码如下:

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

        protected override CreateParams CreateParams    

     {            

  get

        {

                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;

                return cp;

            }  

       }

原理

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

    当一个控件需要绘制时,Windows会向此窗体发送两条消息,第一条是:WM_ERASEBKGND,这条消息使得背景得以绘制,第二条消息是:WM_PAINT,使得前景被绘制,首先背景色是简单的,所以速度较快,前景色较为耗时(相对),所以就产生了这种闪烁现象,这是问题的根源,Winform为此提供了一个解决方案:双缓冲(OptimizedDoubleBuffer)。

    当一个窗体包含许多控件的时候,需要大量的时间来进行绘制,尤其是默认属性的按钮控件。一旦你的窗体包含了50个(或更多)的控件,闪烁的问题就出现了。窗体类首先绘制背景色,打个比方,每个控件的背景色都形容为一个“坑”,那么当你使用透明色或者继承父类选项时,每个洞首先被绘制成白色,黑色,然后每个控件前景色被绘制(填坑),表面上看非常丑,并且没有现成的解决方案,DoubleBuffering也无法解决大量的控件闪烁问题。

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

转载于:https://www.cnblogs.com/guosheng/p/7417918.html

你可能感兴趣的文章
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
hadoop1.2.1 伪分布式配置
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
zookeeper配置文件详解
查看>>
Tomcat配置https、访问http自动跳转至https
查看>>
jquery ajax 前前后后,所有的函数并查询链接
查看>>
asp.net页面截取字符串
查看>>
How to Create a SharePoint 2010 Project Without SharePoint Server
查看>>
区分块元素和行元素
查看>>
Bypass pattern lock on Sony Xperia Z2 and backup all data
查看>>
又黑我等程序猿
查看>>
AppScan入门工作原理详解
查看>>
夺命雷公狗---node.js---6net模块玩telnet通信(下)
查看>>
夺命雷公狗---linux NO:24 linux下的应用程序编译安装
查看>>
jquery选中radio或checkbox的正确姿势
查看>>
arm 工作模式
查看>>
关于 C# 的 lock
查看>>