【问题标题】:WS_EX_TRANSPARENT - What does it actually do?WS_EX_TRANSPARENT - 它实际上是做什么的?
【发布时间】:2011-09-04 03:23:21
【问题描述】:

在我的项目中,我创建了一个不透明度由用户控制的表单。如果表单是完全透明的,鼠标事件就会“消失”(没有我的干预),否则我的表单会处理它们。

在阅读this question 并覆盖 CreateParams 属性以在我的表单上设置 WS_EX_TRANSPARENT 标志后,它现在允许鼠标事件在不透明度为

这正是我想要的,但让我担心的是我不明白它为什么会起作用。

根据我的阅读,WS_EX_TRANSPARENT 旨在通过在其 Paint 方法中从其下方的表单中“窃取位”来使表单看起来透明,因此:

  1. 我的表单的 Paint 方法和其中的所有控件都不应该被调用,对吗?由于 WS_EX_TRANSPARENT 应该导致 Windows 覆盖它们,那么为什么它会影响输入处理而不影响我的表单的绘制?

  2. 不透明度应该对鼠标事件的处理没有影响,就像 Paint 被覆盖一样,“本地”不透明度应该无关紧要,不是吗?

谁能解释一下,这个标志真的是做什么的?它是如何工作的?

【问题讨论】:

    标签: c# winforms winapi forms flags


    【解决方案1】:

    WS_EX_TRANSPARENT 让您的事件(如鼠标点击)落入您的窗口等。不透明度是一个单独的概念,它指示窗口管理器在绘制表单时应用字母混合。这两件事没有关系,但是当你把它们结合起来时,你会得到你需要的效果。

    所以:

    1. 你的表单的Paint方法应该正常调用,不透明度与它无关。

    2. 不透明度不与鼠标事件没有任何关系,如第一段所述。

    【讨论】:

    • 我明白了,但是如何解释我的不透明度级别定义了鼠标是否掉落? (它肯定是不透明度和标志一起工作 - 如果我删除标志,窗​​口必须将不透明度设置为 0 才能忽略鼠标事件)
    • MSDN 在这个问题上是粗略的,请参阅这篇文章进行进一步的实验:codeproject.com/KB/vb/ClickThroughWindows.aspx。
    • 谢谢,文档似乎真的不存在!我很高兴我可以让它做我想做的事,确保我在测试期间密切关注它的行为;)
    【解决方案2】:

    它使窗口对鼠标事件不可见,或者 - 正如微软所说 - 它不会遮挡下面的窗口。我相信它实际上并没有从下面的窗口中窃取像素,但 Windows 本身可能会使用您提供的透明度级别将这两张图片混合在一起。

    透明窗口可用于显示一些进度或启动屏幕,但您必须编写一种方法来关闭它们,因为仅单击 X 不起作用,因为鼠标单击会穿过它。

    因此,它不仅会改变视觉透明度的级别,还会修改行为。不知道你会在哪里读到。

    [编辑]

    C# 中的 Windows 不是只有 opacity 属性吗?

    【讨论】:

    • “C# 中的 Windows 不是只有 opacity 属性吗?” - WPF 有,WinForms 没有。
    • 错了! WinForms 确实有一个 opacity 属性:msdn.microsoft.com/en-us/library/…
    • 此站点 [bobpowell.net/transcontrols.htm] 提到从标记为透明的控件下方的控件中获取像素。 (第一段,或者我误解了?)如果我理解正确,你是说 opacity 属性“覆盖”了标志在混合方面的原始行为,但是是否有任何文档可以绑定鼠标的行为到不透明度,或者您认为这可能只是隐藏在 Windows 中的一些 if 语句,用于显示“alpha
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2012-01-08
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    相关资源
    最近更新 更多