WS_EX_TRANSPARENT - 它实际上是什么作用?

3
在我的项目中,我创建了一个表单,用户可以控制其透明度。如果表单完全透明,鼠标事件会“穿透”(无需我的干预);否则,我的表单会处理它们。
在阅读这个问题并重写CreateParams属性以在我的表单上设置WS_EX_TRANSPARENT标志后,现在允许鼠标事件在不透明时穿透,而任何值小于255的透明度都可以。
这正是我想要的,但我担心我不理解它为什么起作用。
据我所读,WS_EX_TRANSPARENT的目的是通过从其下面的窗体中“窃取位”来使窗体看起来透明,因此:
1. 我的表单及其中所有控件的Paint方法应该从未被调用过,对吗?因为WS_EX_TRANSPARENT应该导致Windows覆盖它们,那么为什么它会影响输入处理而不是我的表单的绘制?
2. 透明度对鼠标事件的处理应该没有影响,因为如果Paint被覆盖,“本地”透明度就不重要了,对吗?
能有人解释一下,这个标志到底是做什么的?它是如何工作的?
2个回答

7

WS_EX_TRANSPARENT使得您的事件(如鼠标点击)能够穿过窗口,等等。透明度是一个独立的概念,它指示窗口管理器在绘制窗体时应用阿尔法混合。这两个东西并不相关,但当您将它们结合在一起时,就会获得您需要的效果。

所以:

  1. 您的窗体的Paint方法按正常方式调用,透明度与此无关。

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


我理解,但是如何解释我的不透明度水平定义了鼠标是否会穿过呢?(这绝对是不透明度和标志一起工作 - 如果我删除标志,则窗口必须将不透明度设置为0,然后它才会忽略鼠标事件) - sebf
MSDN在这个主题上的解释不够清晰,可以参考这篇文章进行进一步实验:http://www.codeproject.com/KB/vb/ClickThroughWindows.aspx。 - Boris B.
谢谢!文档似乎真的不存在!我会很高兴只要能让它做我想要的事情,并确保在测试期间密切关注它的行为 ;) - sebf

0

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

透明窗口可以用于显示某些进度或闪屏画面,但是您必须编写一种关闭它们的方法,因为仅单击X按钮是无效的,因为鼠标点击会穿过它。

因此,它不仅改变了视觉透明度级别,还修改了行为。我想知道您在哪里读到了其他信息。

[编辑]

C#中的Windows难道不只有一个opacity属性吗?


“C#中的Windows只有一个不透明度属性吗?” - WPF有,WinForms没有。 - Ed S.
错误!WinForms确实有一个不透明度属性:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.opacity.aspx - Pedery
这个网站[http://www.bobpowell.net/transcontrols.htm]提到从被标记为透明的控件下面获取像素。(第一段,或者我理解错了?) 如果我理解正确,你是说不透明度属性“覆盖”了标志的原始混合行为,但是否有任何文件将鼠标的行为与不透明度绑定在一起,或者您认为这可能只是Windows中隐藏的某个if语句,该标志的alpha值小于1 - 写入期望它为1或0? - sebf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接