表单无法点击标题栏.TransparencyKey =白色

本文关键字:TransparencyKey 白色 标题栏 表单 | 更新日期: 2023-09-27 18:19:18

如果我创建一个c# (NET 3.5)应用程序使用WinForm模板并设置窗体。透明键属性为白色,标题栏和关闭,最小化,最大化按钮在运行应用程序时不起作用,点击它们会导致窗口失去焦点,就像点击窗口外一样。没有动画,当鼠标悬停在附近等。
这个过程一直持续到最小化窗口(窗口上的按钮不起作用,因此必须通过winkey+m或通过任务栏完成),然后恢复。在此之后,窗口看起来行为正常。

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

环境:Windows Vista (Aero)和VS2008.

表单无法点击标题栏.TransparencyKey =白色

任何与TransparencyKey颜色匹配的窗口部分对用户的眼睛来说都是透明的。对于鼠标来说,如果你点击窗口的透明部分,你会点击你的窗口下面的任何窗口。

这使得使用颜色。白色是一个很糟糕的色键选择,很多情况下用户的主题颜色也会使部分标题栏变成白色。就像关闭按钮中的X。

非常重要的是,你选择一个颜色,使出现在窗口的其他地方,这样你就不会得到意外的透明度。这种颜色的标准选择是color . fuchsia。漂亮的颜色,通常会在用户的视网膜上烧出一个针孔,没有人会自愿在他们的UI设计中使用。


还有一个令人难以忍受的细节:这种通过使用分层窗口创建的透明度,在启用了Aero的现代windows版本上实现的方式不同。在Aero中,它不再由视频适配器实现,而是由DWM在软件中实现。它有一个bug,它不能正确处理某些类型的颜色键值的鼠标透明度。这个bug没有很好地描述,但我知道它不适用于Color。比如红色。所以选择正确的关键颜色是很重要的。除非您想利用这个bug,否则一些程序员仍然希望为窗口的透明部分使用鼠标事件。有风险,但是这个bug已经存在很多年了,所以可能不会再修复了。

还不能评论答案,所以"答案"只是对汉斯·帕桑特的答案的(详细的)评论。更具体地说,那部分:

有一个错误,它不能正确处理鼠标透明度对于某些类型的颜色键值。这个bug不是很好表征,但我知道它不适用于颜色。比如红色。所以选择正确的关键颜色是很重要的。除非你想要这个bug的优点是,一些程序员仍然想要鼠标事件窗口的透明部分。

就是这样,我描述了这个bug。既然我在谈论一个bug,我觉得提到以下信息对于2016年6月2日的。net Framework 4.5有效是很重要的。

这个错误实际上比异常更标准,因为它发生在255/256(99.6%)的颜色中,而只有1/256(0.4%)的颜色,它的行为方式是记录的。

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

已执行的任何鼠标操作,例如单击鼠标在窗体上的透明区域将被转移到透明区域下面的窗口

因此,大部分的灰、绿、紫颜色(包括色)。紫红色= 255,0,255如Hans的回答)

任何其他颜色都将显示该错误,并且所有鼠标事件都将发生在透明控件上。换句话说,如果您想利用这个bug,只需确保选择一种红色组件不同于蓝色组件的颜色( color)。).

因为我可能是第一个记录这个bug的人,所以我不能引用任何参考资料,但是所有16,777,216个RGB组合都经过编程测试,因此,这种相关性在100%的情况下都是有效的。

希望了解bug背后的规则可以帮助人们明智地选择颜色,而不是随机尝试许多颜色,直到他满足期望的行为。

1)窗体有两个属性,分别是Minimize Box和Maximize-box,将它们都设置为true

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