标题栏不能用Form.TransparencyKey = White点击

时间:2014-08-24 12:53:36

标签: c# windows winforms

如果我使用WinForm模板创建C#(.NET 3.5)应用程序并将Form.TransparencyKey属性设置为White,则标题栏和close,minimize,maximize -buttons在运行应用程序时不起作用,单击它们会导致窗口失去焦点,就像在窗口外单击一样。当鼠标悬停在关闭等位置时没有动画。
这一直持续到窗口最小化(窗口上的按钮不起作用,因此必须使用winkey + m或通过任务栏完成)然后恢复。在此之后,窗口似乎表现正常。

这种行为背后的机制是什么?

环境:Windows Vista(Aero)和VS2008。

3 个答案:

答案 0 :(得分:10)

窗口中与TransparencyKey颜色匹配的任何部分对用户的眼睛都是透明的。对于鼠标,如果单击窗口中透明的部分,您将单击下面的任何窗口。

这使得使用Color.White而不是色键的错误选择,用户的主题颜色使得标题栏的部分也变白的可能性很大。就像关闭按钮中的X一样。

非常重要的是,您选择的颜色 not 出现在窗口的任何其他位置,这样您就不会出现意外的透明度。这种颜色的标准选择是Color.Fuchsia。漂亮的颜色通常会在用户的视网膜上烧掉针孔,没有人会自愿使用他们的UI设计。


另一个令人难以忍受的细节:使用分层窗口创建的这种透明度在启用了Aero的现代Windows版本上实现不同。使用Aero,它不再由视频适配器实现,而是由DWM在软件中实现。哪个有错误,它无法正确处理某些种颜色键值的鼠标透明度。这个bug没有很好地表征,但我知道它不适用于Color.Red。因此,选择正确的关键颜色非常重要。除非你想利用这个bug,否则一些程序员仍然希望鼠标事件可以用于窗口的透明部分。风险很大,但这个bug现在已存在很多年了,所以可能不会再修复了。

答案 1 :(得分:1)

无法对答案发表评论,以便"回答"只是对Hans Passant的回答的(详细的)评论。更具体地说,那部分:

  

哪个有错误,它没有正确处理鼠标透明度   对于某些类型的颜色键值。 这个bug不太好   特征,但我知道它对Color.Red不起作用。   因此,选择正确的关键颜色非常重要。除非你想要   这个bug的优点是,一些程序员仍然想要鼠标事件   透明的窗户部分。

所以在这里,我描述了这个bug。由于我在谈论一个错误,我觉得从2016年6月2日起,以下信息对.Net Framework 4.5有效非常重要。

该错误实际上更多的是标准而不是异常,因为它发生了255/256(99.6%)的颜色,并且只有1/256(0.4%)的颜色,它的行为与记录的方式相同。

区分这两种情况的条件实际上非常简单。如果颜色的红色分量与颜色的蓝色分量( Color.Red == Color.Blue )相同,则TransparencyKey将按照记录的方式运行:

  

执行的任何鼠标操作,例如单击鼠标   在表格的透明区域将转移到   透明区域下方的窗户。

因此,大多数灰色,绿色和紫色的颜色(包括Color.Fuchsia = 255 ,0, 255 ,正如Hans'中提到的那样)

任何其他颜色都会出现错误,所有鼠标事件都会在透明控件上出现。换句话说,如果你想利用这个bug,只需确保选择Red组件与Blue组件不同的颜色( Color.Red!= Color.Blue )。

由于我可能是第一个记录该错误的人,我不能引用任何引用,但所有16,777,216种RGB组合都已经过编程测试,因此,所显示的相关性在100%的时间内都是有效的。

希望知道错误背后的规则将有助于某人明智地选择颜色,而不是随意尝试大量颜色,直到他遇到所需的行为。

答案 2 :(得分:0)

1)Form有两个名为Minimize Box和Maximize-box的属性,将它们都设置为true。

2)否则将ControlBox属性设置为true。