WS_EX_TRANSPARENT – 它实际上做了什么?

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

在阅读此问题并覆盖CreateParams属性以在WS_EX_TRANSPARENT上设置WS_EX_TRANSPARENT标志后,它现在允许鼠标事件在不透明度为任何值<255时通过。

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

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

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

  2. 不透明度应该对鼠标事件的处理没有影响,就像要覆盖Paint一样,“局部”不透明度应该不重要,不是吗?

有人可以解释一下,这面旗帜究竟是做什么的 它是如何工作的?

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

所以:

  1. 表单的绘制方法正常调用,不透明度与它无关。

  2. 不透明度与鼠标事件无关,如第一段所述。

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

透明窗口可用于显示某些进度或启动画面,但您必须编写一种方法来关闭它们,因为只需单击X将无法工作,因为鼠标单击将通过它。

因此,它不仅会改变视觉透明度,还会改变行为。 我想知道你会在哪里阅读。

[编辑]

C#中的Windows opacity具有opacity属性吗?