【发布时间】:2021-04-12 15:59:56
【问题描述】:
我正在尝试做一些类似于 Auslogics Disk Defrag 对其自定义窗口所做的事情:
可以看出,窗口周围的模糊半透明阴影比标准阴影要暗得多,所以程序一定是自己绘制的。问题是,我找不到在窗口周围绘制 任何东西透明的方法。
在回答类似问题时,有人建议在实际应用程序窗口后面创建一个稍大的透明窗口(使用WS_EX_LAYERED + SetLayeredWindowAttributes()),然后在透明窗口上进行半透明绘图。它不仅听起来像一个丑陋的黑客,它实际上不起作用。例如,如果尝试通过 GDI+ 在透明窗口上绘制一个半透明的黑色矩形,则将 alpha 混合应用于窗口背景颜色(也将是透明度颜色)之上的形状颜色,然后使用计算出来的颜色,显然不是窗口的透明度,导致一个不透明的矩形。
【问题讨论】:
-
是的,我看到了,但它只是解释了如何在保持 Windows 创建的标准阴影的同时创建无边框窗口。我已经知道该怎么做,这不是我想要做的。我想知道的是如何在窗户周围绘制自己的半透明阴影(或任何其他形状)。或者至少改变标准的颜色/暗度,但我认为这是不可能的。
-
需要“丑陋的黑客”才能获得这种效果。 GDI+ 是一匹老马,无法做到这一点,您必须接受 DirectWrite 支持的那种渲染。已经存在了十多年了,尽管 GUI 框架的支持很微弱。 WPF 可以做到。
-
是的,我想我可能不得不使用比 GDI+ 更复杂的东西。顺便说一句,当我说丑陋的黑客时,我只是指创建一个额外的窗口。我已经假设我必须创建一个透明的窗口。我确实尝试让我的主窗口部分透明(只是围绕它的一个透明框架),捕获它周围的屏幕部分,在其上混合 alpha,然后将它放在窗口上。它可以工作,但当然,如果我拖动窗口,它会闪烁。我想我会尝试使用 DWM 和 Direct3D 来兼容 Vista/7。