2009-02-16 122 views
3

我想用透明度创建顶层窗口(即非WS_CHILD)。然而,我不希望它是一个简单的面具,其中一个给定的像素是完全透明或完全不透明的。而且我不希望整个窗口对它有一些alpha级别。相反,我希望这个窗口基本上是完全透明的,用一个alpha通道绘制一个位图,这样位图就可以和它后面的任何窗口混合在一起。图片,比如说,一个阳光照射,图像自己的alpha从不透明到从中心向外完全透明的混合。透明顶层窗口

我发现两种方法,都得到接近我想要做的,但并不完全。使用区域,我可以剪出一个完全透明的部分。使用分层窗口,我也可以做类似的事情(甚至可以使整个窗口稍微透明,但这不是我想要的)。我研究过其他样式,例如WS_EX_TRANSPARENT和WS_EX_COMPOSITE,但无济于事。

我能得到这样的效果上下工夫子窗口就好了,因为它们与他们的父母的区域内其父窗口交融。让顶级窗口以类似的方式工作仍然无法实现。

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

回答

2

Layered windowsWS_EX_LAYERED)应该做的工作,记住,你必须使用UpdateLayeredWindow()和不同寻常的位图格式(32位,预乘阿尔法)来指定每个像素的阿尔法值(SetLayeredWindowAttributes()只会让你为整个窗口或颜色键指定单个Alpha值)。

你说你已经试过这个 - 你遇到过什么问题?

+0

我的问题是我不理解如何正确使用UpdateLayeredWindow,所以没想到我需要它。关键是设置混合函数并为位图提供正确的直流。所以,得到它的工作,谢谢! – 2009-02-17 17:10:52

1

我知道拿到窗口上每个像素的α的唯一方法是UpdateLayeredWindow()。
看看这个MSDN链接:http://msdn.microsoft.com/en-us/library/ms997507.aspx

注意,使用UpdateLayeredWindow应用程序时不需要回应WM_PAINT或其他绘画的消息,因为它已经提供的视觉表现为窗口,系统将照顾存储该图像,编写它,并将其呈现在屏幕上。 UpdateLayeredWindow功能非常强大,但它通常需要修改现有Win32应用程序绘制的方式

我敢打赌,这些都是你遇到的问题。

+0

出于某种原因,我一直忽略UpdateLayeredWindow(),但更多地看它,我得到了它的工作。幸运的是,我实际上甚至不必更改我的应用程序如何绘制过于剧烈,因为它只适用于某些特定的窗口。 – 2009-02-17 17:16:15