我通过添加WS_EX_LAYERED扩展样式创建了一个分层窗口:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows 将使用黑色作为色度键颜色值。我将留下一个黑色的大边框以使问题变得明显:
构建窗口后,我告诉它使用黑色作为色度键颜色:
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
现在弹出的分层窗口显示为部分透明:
问题是最后一步。我想使用自 Windows XP 以来可用的CS_DROPSHADOW类样式来创建投影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
出现了投影,但是阴影包围了原来的矩形窗口,并且没有考虑到分层窗口提供的窗口透明度:
有谁知道我在某个地方错过了什么神奇的选项,可以让投影尊重非矩形分层窗口?
出现此问题的另一个示例是当您不包含 6px 填充/边距时。Windows® 主题绘制的提示窗口是非矩形的。这会在窗口透明的地方留下一个小的可见间隙,但不会出现投影:
正如您从 Internet Explorer 的提示中看到的那样,Microsoft 已设法使其工作:
仔细查看 Windowstooltips
类提示窗口。使用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 2000 出现了分层 Windows。CS_DropShadow 是随 XP 添加的。