gpt4 book ai didi

winapi - Win32 : How to make drop shadow honor non-rectangular Layered window?

转载 作者:行者123 更新时间:2023-12-03 14:20:06 29 4
gpt4 key购买 nike

我创建了一个 layered window通过添加 WS_EX_LAYERED扩展风格:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows 将使用黑色作为色度键颜色值。我将留下一个黑色的大边框以使问题变得明显:

alt text


窗口构建完成后,我告诉它 use black as a chroma-key color :
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);

现在弹出的分层窗口显示为部分透明:

alt text


问题是最后一步。我想使用 CS_DROPSHADOW类样式,自 Windows XP 起可用,用于创建投影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;

出现了投影,但是阴影包围了原来的矩形窗口,并且没有考虑到分层窗口提供的窗口透明度:



有谁知道我在某个地方错过了什么神奇的选项,可以让投影尊重非矩形分层窗口?

出现此问题的另一个示例是当您不包含 6px 填充/边距时。 Windows® 主题绘制的提示窗口是非矩形的。这会在窗口透明的地方留下一个小的可见间隙,但不会出现投影:

alt text

正如您从 Internet Explorer 的提示中看到的那样,Microsoft 已设法使其工作:

alt text


仔细观察 Windows tooltips类提示窗口。使用 spy XX - 我可以得到它的窗口矩形和类样式:



SpyXX 说:
Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20

所以一切都指向窗口本身是 104x20 像素,在窗口本身之外有阴影。 (这与 CS_DROPSHADOW 一致。)

接下来我可以看看 tooltips 的样式窗口类:
Windows Styles:     94000001

WS_POPUP 80000000
WS_VISIBLE 10000000
WS_CLIPSIBLINGS 4000000
TTS_ALWAYSTIP 1

Extended Styles: 00080088

WS_EX_LAYERED 80000
WS_EX_TOOLWIN 80
WS_EX_TOPMOST 8

有趣的是,它不使用 CS_SAVEBITS ( 0x800);这对于小型、短暂的窗口很有用。

它也不使用 CS_DROPSHADOW ( 0x20000)。所以现在我想知道它是如何在自己的窗口之外绘制的?

注:透明分层窗口被记录为区域的首选技术。

编辑:分层 Windows 已随 Windows 2000 出现。CS_DropShadow 是随 XP 添加的。

最佳答案

Transparent layered windows is documented as the preferred technique over regions.



但是, CS_DROPSHADOW确实注意地区。如果您使用区域裁剪或以其他方式塑造您的窗口,则投影将跟随新的轮廓。

幸运的是,您可以使用带有分层窗口的区域,并通过将两者结合起来获得您正在寻找的效果。

顺便说一句:tooltips_class32 确实使用 CS_DROPSHADOW - 您不会在窗口样式中看到它,因为它是类样式,而不是窗口样式。

关于winapi - Win32 : How to make drop shadow honor non-rectangular Layered window?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224220/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com