透明的顶层窗口

4
我想创建一个顶级窗口(即非WS_CHILD),并使其具有透明度。但是,我不希望它只是一个简单的遮罩,其中给定像素要么完全透明,要么完全不透明。我也不希望整个窗口都具有某些alpha级别。相反,我希望窗口基本上是完全透明的,并绘制带有alpha通道的位图,以便位图与任何在其后面的窗口混合。比如,假设有一个太阳爆发的图像,其中图像自己的alpha从中心向外从不透明到完全透明混合。

我找到了两种方法,都接近我想要做的事情,但并不完全符合我的要求。使用区域,我可以剪切出一个完全透明的部分。使用分层窗口,我也可以做类似的事情(甚至可以使整个窗口稍微透明,但这根本不是我想要的)。我已经研究了其他样式,例如WS_EX_TRANSPARENT和WS_EX_COMPOSITE,但没有结果。

我可以让这种效果在子窗口上正常工作,因为它们在其父窗口的区域内与其父窗口混合。但是,使其类似地适用于顶级窗口仍然困扰着我。

我知道这是可以做到的,因为有人向我保证他们在其他程序中看到了它。我觉得我只是没有完全理解关于绘制窗口的一些简单内容。

2个回答

2

分层窗口WS_EX_LAYERED)可以完成此任务,需要注意的是您必须使用UpdateLayeredWindow()和一个略微不同寻常的位图格式(32位,预乘alpha)来指定每个像素的alpha值(SetLayeredWindowAttributes()只允许您为整个窗口或颜色键指定单个alpha值)。

您说您已经尝试过这个方法 - 您遇到了什么问题?


我的问题在于我不理解如何正确使用UpdateLayeredWindow,因此认为我不需要它。关键是设置混合功能并为位图提供正确的DC。所以,现在已经解决了,谢谢! - Doug Kavendek

1
我所知道的在窗口上实现每个像素的alpha通道的唯一方法是使用UpdateLayeredWindow()。
请查看此MSDN链接:http://msdn.microsoft.com/en-us/library/ms997507.aspx 请注意,当使用UpdateLayeredWindow时,应用程序不需要响应WM_PAINT或其他绘画消息,因为它已经提供了窗口的视觉表示,系统将负责存储该图像、组合它并在屏幕上呈现它。UpdateLayeredWindow非常强大,但它经常需要修改现有Win32应用程序的绘制方式。
我敢打赌这些就是你遇到的问题。

出于某些原因,我之前一直忽视了UpdateLayeredWindow(),但是经过更深入的研究,我终于搞定它了。幸运的是,我实际上甚至不需要太大程度地改变我的应用程序绘制方式,因为它只适用于特定的窗口。 - Doug Kavendek

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