【问题标题】:Transparent top-level windows透明的顶层窗口
【发布时间】:2010-10-07 23:36:37
【问题描述】:

我想创建一个透明的顶级(即不是 WS_CHILD)窗口。但是,我不希望它是一个简单的蒙版,其中给定的像素要么是完全透明的,要么是完全不透明的。而且我不希望整个窗口都具有一定的 alpha 级别。相反,我希望窗口本质上是完全透明的,并使用 alpha 通道绘制位图,以便位图与它后面的任何窗口混合。例如,一个旭日形图像,其中图像自身的 alpha 从中心向外从不透明混合到完全透明。

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

我可以让这种效果在子窗口上正常工作,因为它们在其父区域内与其父窗口混合。让它在顶级窗口中以类似方式工作仍然让我难以捉摸。

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

【问题讨论】:

    标签: winapi gdi alpha


    【解决方案1】:

    Layered windows (WS_EX_LAYERED) 应该可以完成这项工作,请记住,您必须使用 UpdateLayeredWindow() 和有点不寻常的位图格式(32 位,预乘 alpha)来指定每个像素的 alpha 值( SetLayeredWindowAttributes() 只允许您为整个窗口或颜色键指定单个 alpha 值。

    你说你已经尝试过了——你遇到了什么问题?

    【讨论】:

    • 我的问题是我不了解如何正确使用 UpdateLayeredWindow,因此认为我不需要它。关键是设置混合功能并为其提供正确的位图直流。所以,让它工作,谢谢!
    【解决方案2】:

    我知道在窗口上获取每像素 alpha 的唯一方法是 UpdateLayeredWindow()。
    查看此 MSDN 链接:http://msdn.microsoft.com/en-us/library/ms997507.aspx

    请注意,当使用 UpdateLayeredWindow 时,应用程序不需要响应 WM_PAINT 或其他绘画消息,因为它已经为窗口提供了可视化表示,系统将负责存储该图像、合成它并渲染它在屏幕上。 UpdateLayeredWindow 非常强大,但它通常需要修改现有 Win32 应用程序的绘制方式

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

    【讨论】:

    • 出于某种原因,我一直在忽略 UpdateLayeredWindow(),但仔细研究它,我得到了它的工作。幸运的是,实际上我什至不必太大幅度地更改我的应用程序的绘制方式,因为它只适用于某些特定的窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2013-02-21
    • 1970-01-01
    • 2013-09-02
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多