使窗口完全透明的问题

时间:2014-04-29 00:30:49

标签: c++ windows

我使用了http://www.codeproject.com/Articles/15523/Own-thread-Win32-splash-screen中的源文件为专用游戏服务器GUI创建了一个启动画面。这个启动画面如下图所示:

enter image description here

这是问题所在:

enter image description here

可以看出,窗口背景并不透明。我已经搞砸了Adobe Illustrator中的实际图像,但我可以确认图像没有错误。

我已经尝试按照这些线程/说明使窗口变得透明,以便看到启动画面的完整影响,但是它们未能提出解决方案: Creating a transparent window in C++ Win32 How to create fully transparent window which has not transparent content? http://www.overclock.net/t/1113233/solved-c-semi-transparent-window

他们都使用不同的方法来创建启动画面,但有些解决方案对我有用。 我在这里做错了什么?

编辑: 问题是,我如何(成功地)使我的窗户透明?

1 个答案:

答案 0 :(得分:2)

这个问题对我来说仍然有点不清楚,但无论如何我都会尝试回答它。如果我错了,请纠正我,我很乐意删除或修改这个答案...

据我了解,您发布的the first image是原始起始图像 - 您希望显示为闪屏的图像。你知道,Adobe Photoshop-style

沿着这些方向,我假设您想要透明绘制的区域是风格化的玻尔模型上方和后方的灰色渐变区域。这将有效地反映Adobe的启动画面所实现的效果,其中饰品似乎“悬挂”矩形闪屏的边框,因为它们具有透明背景。

问题是您想要透明的区域在原始图像中透明。它也不是纯色,可以用来模拟透明度。

事实上,这正是the answers to the linked question建议创建透明窗口的方式:

  1. 创建适当大小的顶级窗口,并通过设置WS_EX_LAYERED扩展窗口标志使其成为分层窗口。
  2. 使用启动画面图像绘制其背景以响应WM_PAINT消息。
  3. 使用LWA_COLORKEY标记调用SetLayeredWindowAttributes function,以在闪屏图像中设置将变为透明的蒙版颜色。
  4. 为了使其正常工作,遮罩颜色需要填充您想要显示透明的区域。这种遮罩颜色的一个常见选择是紫红色(RGB = 255,0,255) - 这个转换短语的颜色为 credit to Hans Passant!) 这不太可能出现在图像中的任何其他位置。

    这也允许您使用简单的GDI完成所有操作。不需要依赖GDI +,也可能稍快一些。使用启动画面,您希望事物尽可能快地出现在屏幕上。

    当然,您可以执行更复杂的操作,例如使用BLENDFUNCTION和/或具有预乘Alpha通道值的图像。但除非绝对必要,否则我会避免所有的努力。您的用户最多会看到这个启动画面一两秒钟。它只是在那里向他们保证应用程序实际上正在启动。如果他们看到的时间比这个时间长,那么最好花时间优化应用的启动时间,而不是美化它。