【问题标题】:Titlebar not clickable with Form.TransparencyKey = White使用 Form.TransparencyKey = White 时无法点击标题栏
【发布时间】:2014-08-24 12:53:35
【问题描述】:

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

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

环境:Windows Vista (Aero) 和 VS2008。

【问题讨论】:

    标签: c# windows winforms


    【解决方案1】:

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

    这使得使用 Color.White 作为颜色键的选择相当糟糕,很有可能用户的主题颜色也会使部分标题栏变成白色。就像关闭按钮中的 X。

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


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

    【讨论】:

    • 我现在更好地理解了透明度,并且在使用 Windows 经典主题时它可以按预期工作。使用 Aero,它的行为就好像窗口的整个玻璃边框都是白色的(因此是透明的),但仅适用于鼠标。
    • 我不会将 Hans 的帖子编辑成粗体部分,所以让我引用这一点来强调他的观点:更令人痛苦的细节:..软件 ..它有一个错误,它无法正确处理某些颜色键值的鼠标透明度..Color.Red 例如去过那里,被咬过,现在我知道了..
    【解决方案2】:

    还不能对答案发表评论,因此“答案”只是对 Hans Passant 答案的(详细)评论。更具体地说,那部分:

    其中有一个错误,它不能正确处理鼠标透明度 对于某些类型的颜色键值。 这个bug不好 特征,但我知道它不适用于 Color.Red 例如。 所以选择正确的关键颜色很重要。除非你想拿 利用该错误,一些程序员仍然希望鼠标事件 窗口的透明部分。

    就是这样,我描述了这个错误。由于我在谈论一个错误,所以我觉得有必要提及以下信息对于 .Net Framework 4.5 自 2016 年 2 月 6 日起有效。

    该错误实际上比异常更标准,因为它发生在 255/256 (99.6%) 的颜色中,并且仅针对 1/256 (0.4%) 的颜色,它的行为方式与记录的方式相同。

    区分这两种情况的条件实际上很简单。如果颜色的红色分量与颜色的蓝色分量相同(Color.Red == Color.Blue),则 TransparencyKey 的行为与记录中的一样:

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

    因此,大多数灰色、绿色和紫色(包括 Hans 的回答中提到的 Color.Fuchsia = 255,0,255) p>

    任何其他颜色都会显示该错误,并且所有鼠标事件都将在透明控件上发生。换句话说,如果您想利用该漏洞,只需确保选择红色组件与蓝色组件不同的颜色 (Color.Red != Color.Blue)。 p>

    由于我可能是第一个记录该错误的人,因此我无法引用任何参考资料,但所有 16,777,216 种 RGB 组合都已通过编程方式进行测试,因此,这种相关性在 100% 的情况下都是有效的。

    p>

    希望了解错误背后的规则将帮助某人明智地选择颜色,而不是随机尝试多种颜色,直到满足所需的行为。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多