最近从师兄手上接了一个C#的项目,需要用到MDI窗体,可是每当我显示子窗体的时候会有一次“闪烁”,很明显,看起来非常不爽,查找许久,知道是每次在show()子窗体的时候都会调用子窗体构造函数重绘窗体,其中需要将子窗体的尺寸调整到我在程序中设置的大小,无论我这样设置,这个窗口大小变化总会在show()的时候显示出来,我试过网上说的设置双缓冲、先隐藏窗体等启动之后再显示、借助定时器设置窗体的opacity属性,可是问题依旧,没有任何变化,一个偶然的机会找到了微软的MSDN论坛,发现遇到这个问题的哥们儿还不少,各种国家的程序员都有,其中一个哥们提供了一种一劳永逸的解法,彻底的解决了我的问题,天降救世主啊,为了这个问题我茶饭不思了好多天,现将方法分享一下,网上有很多人都有遇到这个问题,可是这是我唯一看到的解法,值得各位码农收藏啊,原文网址如下,谢谢这位美国小伙子:
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/aaed00ce-4bc9-424e-8c05-c30213171c2c/
解决办法很easy:
将以下代码块加在父窗体中的任意位置
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
原理很简单,引用以下原话:
A form that has a lot of controls takes a long time
to paint. Especially the Button control in its default style is expensive. Once you get over 50 controls, it starts getting noticeable. The Form class paints its background first and leaves "holes" where the controls need to go. Those holes are usually
white, black when you use the Opacity or TransparencyKey property. Then each control gets painted, filling in the holes. The visual effect is ugly and there's no ready solution for it in Windows Forms. Double-buffering can't solve it as it only works for
a single control, not a composite set of controls.
I discovered a new Windows style in the SDK header files, available for Windows XP and (presumably) Vista: WS_EX_COMPOSITED.
With that style turned on for your form, Windows XP does double-buffering on the form and all its child controls.
分享到:
相关推荐
C# 多文档程序 子窗体间切换时闪屏的解决
winform窗体内如果控件太多,在新建窗体活窗体刷新时,都会各种闪屏,网上百度,各种开缓存,实际并未说明白
C#子窗体间切换时闪屏的解决方法,用VS2005打开,并添加了注释。很容易就看懂。。
C#彻底解决listview的闪屏问题.doc
C/S 设备界面:启动闪屏窗体 设备界面:设置闪屏窗体
C#制作闪屏的几个方法1:在主窗体之前出现闪屏二:窗体闪烁
C# 闪屏 窗体渐进效果 源代码实现。
这个闪屏主要的特色在于加入背景图片后,可以很简单的调用闪屏
双缓冲解决切换图片闪屏实例双缓冲解决切换图片闪屏实例
C#制作的闪屏,可以设置Splash闪屏窗体的各种设置信息,例如标题,背景图片、窗体大小、渐进模式、前端显示等。
C#闪屏SplashScreen源代码
该文档中有关于C#中LISTVIEW控件闪屏的有关网址链接,源码等,能很好的解决你在使用列表视图控件中需要大量处理数据时的闪屏问题。
重写listview控件,彻底解决listview添加项闪屏问题
电脑显示器闪屏怎么回事 电脑显示器闪屏解决方法【详细介绍】.docx
电脑显示器闪屏怎么办 显示器闪屏原因【解决方法】.docx
c#中关于闪屏的渐隐渐显实现代码,代码实现简单,使用了timer控件控制闪屏中文字的动态出现
用汇编去除Autoplay Menu Builder闪屏方法.docx
C#闪屏代码
VC++6.0利用双缓存技术,解决闪屏问题,代码有详细注释
c# 钩子 闪屏 关机 源代码加程序包 对c#感兴趣的朋友可以看看哦!!!!