整个Windows Forms的painting框架是基于GDI+。我们知道GDI+是支持透明色的,也就是支持带有alpha的颜色。那为什么绝大部分控件不知道半透明的背景颜色呢?这是Winforms受到了Win32 API的限制。
在Winforms的所有控件中,只有Form和ToolStripDropDown支持Opacity属性。当Opacity属性的值为0时,为完全透明;当值为1时,则为完全不透明;当值在0和1之间时,则显示出半透明的效果。
那么为什么其他控件不能实现半透明的效果呢?当我们深入到Winform的内部代码去分析Opacity的内部实现的时候,我们发现半透明效果需要控件支持WS_EX_LAYERED。从MSDN http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx上我们发现WS_EX_LAYERED不能用于子窗口(Child Window)上。Form不能成为其他窗口的子窗口,而ToolStripDropDown只有在TopLevel为true的时候Opacity才有效,此时窗口的类型是pop-up而不是child类型。因此这两个类型的空间支持Opacity属性。而其他所有空间在创建的时候都用了WS_CHILD类型,都属于Child窗口,所以都不可能支持Opacity属性。
如果希望其他空间支持半透明的背景颜色,我们除了BackColor的颜色含有alpha信息之外,还需要把ControlStyles.SupportsTransparentBackColor和ControlStyles.UserPaint设为true.例如我们希望得到背景颜色为透明的Label,我们可以自己从Label继承出一个类,并在该类的构造函数里调用Control.SetStyle函数把前面两个Style设为true.此时如果背景颜色的alpha值为0,则该Label的背景变成透明的了。值得一提的是,由于Control.UserPaint为true,我们需要自己负责Paint的全过程,Winforms不会自动把控件画出来。例如在缺省情况下,ListBox中的所有Item就不会画出来,我们需要在它的Paint事件处理器里完成Paint操作。
文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008915/142893.html
分享到:
相关推荐
Wpf里面 调用winForms控件的pdf阅读代码,简单的源码 时候初学者.
Spread for WinForms 表格控件 V7.0 使用指南
WeifenLuo.WinFormsUI.Docking控件的应用介绍,很好的入门文档
继承Control的自定义textbox感谢某位高人的指点。 可以自己设置透明度、设置背景颜色、设置圆角大小、设置最大多少字符、设置显示的密码字符
C#中自定义控件--拼音匹配 C# 自定义 控件 (WinForms)
Winforms皮肤控件 用来美化界面的确不错
使用WeifenLuo.WinFormsUI.Docking 控件应用 实现窗体浮动 树形展示,索引目录查找功能
通俗易懂,很好理解的课件,感觉比看书要有意思,不喜欢看很厚的书又想学C#的可以考虑
SKSDotNetCtrl DevComponents.DotNetBar 这两组winform控件库直接添加选择项到工具栏就可以用了。
DevExpree Winforms_主要控件帮助译文
Timer 控件使用,ListView 控件,TreeView 控件
支持framwork4 最新版。 没错!是WeifenLuo.WinFormsUI.Docking.dll 的源代码和示例程序! DockPanel Suite是一个国外开源项目。 项目要引用WeifenLuo.WinFormsUI.Docking.dll,这个程序集包含了控件及相关类。...
软件中使用布局控件布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件,用过的人都深有体会,该控件之强大、美观、不亚于商业控件。而且控件使用也是比较简单的。先看看控件使用的程序界面展示效果。
布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件,用过的人都深有体会,该控件之强大、美观、不亚于商业控件。而且控件使用也是比较简单的. 源码地址:...
若要让自己的Winforms桌面程序更加酷,SideBar是必不可少的控件之一!
Janus.WinForms.Controls.Suite.v2.0.1000控件包 破解版
WeifenLuo.WinFormsUI.Docking.dll 重新编译,支持4.0了 输出选4.0,不要client那个
在winforms下用于分页的控件,主要用于网页中内容较多需要分页的地方
本文介绍了使用DevExpress WinForms控件(版本15.2)设计和创建WinForms用户界面。
一个开源的.netWinform控件。挺好用的,大家共享