为什么Winforms控件不支持半透明的背景颜色

 整个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值