C# CreateParams作用和它的副作用

勇哥注:

当初勇哥使用这段代码是为了启用双缓冲,避免窗口控件过多引起重绘过慢闪烁。

因为是引用别人的代码,并不知道它是啥意思。而且时至今天,还发现其有副作用。


先来谈谈它的作用


窗体和控件的属性CreateParams,通过它你能够很方便的控制窗体或控件诸如边框、最大化、最小化关闭,按钮的隐藏、窗体的模式化,弹窗模式等的一些特性。

如: 让窗体的关闭按钮不可用。虽然通过ControlBox 也可让,最大,最小,关闭三个按钮都不显示。

const int NO_CLOSE_BUTTON = 0x200;protected override CreateParams CreateParams
{    get
    {
        CreateParams cp = base.CreateParams;
        cp.ClassStyle =cp.ClassStyle| NO_CLOSE_BUTTON;        return cp;
    }
}

例:让窗体不显示。

protected override CreateParams CreateParams
{    get
    {
        this.Visible = false;        return base.CreateParams;
    }
}

例:防止WinFrom切换闪屏问题时也可采用此种办法。

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. 


具有大量控件的窗体需要很长时间才能绘制。特别是默认样式的Button控件非常昂贵。
一旦你超过了50个控件,它就会变得引人注目。Form类首先绘制其背景,并在控件需要的位置留下“洞”。使用“不透明度”(Opacity)
或“透明度关键点”(TransparencyKey)属性时,这些孔通常为白色和黑色。然后,每个控件都会被绘制,填充孔。
视觉效果很难看,而且在Windows窗体中没有现成的解决方案。双缓冲不能解决这个问题,因为它只适用于单个控件,而不是一组复合控件。

我在SDK头文件中发现了一种新的Windows风格,适用于Windows XP和(可能)Vista:WS_EX_COMPOSITED。
为窗体打开该样式后,Windows XP会对窗体及其所有子控件进行双重缓冲。


然后,国内的人就照搬了。

勇哥再照搬国人了。


殊不知,此代码的副作用是会引发cpu耗能爆涨!

  1.   会让你的winfrom出现手工缩放窗口大小后,cpu耗能变大,并且无法降下来。

  2.   会使得Property控件的面板卡住,甚至等很长时间才能关闭。


关于第2点,请参考勇哥的一个贴子,这个万年贴是困惑很久的一个问题:

http://www.skcircle.com/?id=1969



而在CSDN中也有原话记载:

(可见并不推荐你在任何时候去使用它)

引用MSDN中对CreateParams的说明:
    在你开发的重载控件中不要重写这个属性,通过这个属性控制控件的某些风格。
    只有在你封装Windows控件或者想实现某些WinForm没有提供的风格(比如Layered Window)控制的时候再使用这个属性。
    更多信息请参照MSDN上对CreateWindow方法和CreateWindowEx方法的参数CREATESTRUCT结构体的文档注释 。
简述为何CreateParams能够实现这样高级的样式控制,因为从CreateWindow和CreateWindowEx的名字就可以看出,
CreateParam是传递给这俩个方法的参数,而这两个方法又是在窗体创建的时候调用的。
所以,CreateParam才能够实现如此强大的样式控制。




--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864