WS_EX_TRANSPARENT – 它实际上做了什么?
在我的项目中,我创建了一个由用户控制的不透明度的表单。 如果表单是完全透明的,那么鼠标事件会“通过”(没有我的干预),否则我的表单会处理它们。
在阅读此问题并覆盖CreateParams属性以在WS_EX_TRANSPARENT
上设置WS_EX_TRANSPARENT
标志后,它现在允许鼠标事件在不透明度为任何值<255时通过。
这正是我想要的,但它让我担心我不明白它为什么会起作用。
根据我的阅读,WS_EX_TRANSPARENT旨在通过在Paint方法中从其下面的表单中“窃取位”使表单显得透明,因此:
-
我的表单的Paint方法及其中的所有控件都不应该被调用,对吧? 由于WS_EX_TRANSPARENT应该导致Windows覆盖它们,那么为什么它会影响输入处理而不影响我的表单?
-
不透明度应该对鼠标事件的处理没有影响,就像要覆盖Paint一样,“局部”不透明度应该不重要,不是吗?
有人可以解释一下,这面旗帜究竟是做什么的 它是如何工作的?
WS_EX_TRANSPARENT使您的事件(如鼠标点击)落入您的窗口等等。 不透明度是一个单独的概念,它指示窗口管理器在绘制表单时应用alphablending。 这两件事情没有关系,但是当你把它们结合起来时,你会得到你需要的效果。
所以:
-
表单的绘制方法正常调用,不透明度与它无关。
-
不透明度与鼠标事件无关,如第一段所述。
它使窗口对鼠标事件不可见,或者 – 如微软所说 – 它不会掩盖下面的窗口。 我相信它实际上并没有从下面的窗口中窃取像素,但Windows本身可能会将这两张图片混合在一起,使用你提供的透明度。
透明窗口可用于显示某些进度或启动画面,但您必须编写一种方法来关闭它们,因为只需单击X将无法工作,因为鼠标单击将通过它。
因此,它不仅会改变视觉透明度,还会改变行为。 我想知道你会在哪里阅读。
[编辑]
C#中的Windows opacity
具有opacity
属性吗?