【发布时间】:2011-01-14 12:25:30
【问题描述】:
我通过添加 WS_EX_LAYERED 扩展样式创建了 layered window:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows 将使用黑色作为色度键颜色值。我将留下一个黑色的大边框以使问题变得明显:
窗口构建完成后,告诉use black as a chroma-key color:
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
现在弹出的分层窗口显示为部分透明:
问题是最后一步。我想使用自 Windows XP 起可用的 CS_DROPSHADOW 类样式来创建阴影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
出现了投影,但是阴影包围了原来的矩形窗口,并没有考虑到分层窗口提供的窗口透明度:
有谁知道我在某个地方错过了什么神奇的选项,可以让投影尊重非矩形分层窗口?
出现此问题的另一个示例是当您不包含 6 像素填充/边距时。 Windows® 主题绘制的提示窗口是非矩形的。这会在窗口透明的地方留下一个小的可见间隙,但不会出现投影:
Microsoft 已设法使其工作,正如您从 Internet Explorer 的提示中看到的那样:
仔细查看 Windows tooltips 类提示窗口。使用 SpyXX - 我可以获得它的窗口矩形和类样式:
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 添加。
【问题讨论】:
-
请让您的图片适合工作环境。
-
我在一家银行工作,有时会进行电视直播采访,因此非常感谢编辑图像;否则我可能会失业。
-
这是一个老问题,可能是错字,但你写了逻辑或(“||”),而应该按位或(“|”)写。
标签: winapi dropshadow layered-windows ws-ex-layered