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