如果我使用WinForm模板创build一个C#(.NET 3.5)应用程序,并将Form.TransparencyKey属性设置为White,则标题栏和closures,最小化,最大化button在运行应用程序时不起作用,点击它们会导致窗户失去焦点的方式与在窗外点击相同。 鼠标hover时没有animation
这一直持续到窗口被最小化(窗口上的button不起作用,所以必须用winkey + m或通过任务栏完成)然后恢复。 在此之后窗口看起来performance正常。
这种行为背后的机制是什么?
环境:Windows Vista(Aero)和VS2008。
与TransparencyKey颜色相匹配的窗口的任何部分对用户来说都是透明的。 对于鼠标,如果点击透明窗口的一部分,则可以单击您下方的任何窗口。
这使得使用Color.White而不是颜色键的一个不好的选择,用户的主题颜色也使得标题栏的部分变成白色的可能性很大。 就像关闭按钮中的X一样。
非常重要的是,你选择的颜色不会出现在窗口的任何其他地方,所以你不会意外的透明。 这种颜色的标准选择是Color.Fuchsia。 通常会在用户的视网膜上燃烧针孔,而且没有人会自愿使用它们的UI设计。
另外一个令人难以忍受的细节是:使用分层窗口创建的这种透明度在具有Aero功能的现代Windows版本上实现不同。 使用Aero,它不再由视频适配器实现,而是由DWM软件实现。 这有一个错误,它不能正确处理某些种类的颜色键值的鼠标透明度。 这个bug没有很好的表征,但是我知道它不适用于Color.Red。 所以选择正确的关键颜色很重要。 除非你想利用这个bug,否则一些程序员仍然希望在窗口的透明部分使用鼠标事件。 危险的,但是这个bug已经存在很多年了,所以可能不会再被修复了。
1)表单有两个属性,称为最小化框和最大化框,将它们都设置为true。
2)否则将ControlBox属性设置为true。
不能评论答案,所以“答案”只是Hans Passant答案的一个(详细的)评论。 更具体地说,那部分:
这有一个错误,它不能正确处理某些种类的颜色键值的鼠标透明度。 这个bug没有很好的表征 ,但是我知道它不适用于Color.Red。 所以选择正确的关键颜色很重要。 除非你想利用这个bug,否则一些程序员仍然希望在窗口的透明部分使用鼠标事件。
所以在这里,我是这个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)
任何其他颜色都会显示错误,并且所有的鼠标事件都会出现在透明控件上。 换句话说,如果你想利用这个bug,只要确保选择一个红色组件不同于蓝色组件( Color.Red!= Color.Blue )的颜色 。
由于我可能是第一个记录该错误的人,所以我不能引用任何参考文献,但是所有16,777,216个RGB组合都已经过编程测试,因此,所显示的相关性100%是有效的。
希望知道bug背后的规则将帮助某个人明智地选择一种颜色,而不是随机尝试大量的颜色,直到他达到预期的行为。