wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows将使用黑色作为色度键颜色值。我要离开一个黑色的大边框,使问题显而易见:
alt text http://i45.tinypic.com/2qs002q.jpg
窗口建成后,我告诉use black as a chroma-key color:
SetLayeredWindowAttributes(hwnd,0x00000000,255,LWA_COLORKEY);
现在弹出的分层窗口显示为部分透明:
alt text http://i48.tinypic.com/2cfta3o.jpg
问题是最后一步。我想使用CS_DROPSHADOW类风格,从Windows XP开始,可以创建一个阴影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
阴影出现,但阴影围绕原始的矩形窗口,并不考虑分层窗口提供的窗口的透明度:
http://i49.tinypic.com/23lnnu9.jpg
有没有人知道我会错过什么神奇的选择,将使阴影荣耀非矩形分层窗口?
出现这个问题的另一个例子是当你不包括6px padding / margin。 Windows®主题绘制的提示窗口是非矩形的。这留下了一个小的可见的间隙,窗口是透明的,但是阴影没有出现:
alt text http://i47.tinypic.com/30arsxk.png
Microsoft已经设法使其工作,从Internet Explorer的这个提示可以看出:
alt text http://i46.tinypic.com/f104cj.jpg
看一下Windows工具提示类提示窗口。使用SpyXX – 我可以得到它的窗口和类样式:
http://i49.tinypic.com/f4pued.jpg
SpyXX说:
Rectangle: (440,229)-(544,249),104x20 Restored Rect: (440,104x20 Client Rect: (0,0)-(104,20),104x20
所以一切都指向窗口本身就是104×20像素,窗外本身就有阴影。 (与CS_DROPSHADOW一致)
接下来我可以看一下工具提示窗口类的样式:
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。
Transparent layered windows is documented as the preferred technique over regions.
不过CS_DROPSHADOW确实注意地区。如果您使用区域裁剪或以其他方式塑造您的窗口,则阴影将遵循新轮廓。
幸运的是,您可以使用具有分层窗口的区域,并通过组合二者获得您要查找的效果。
BTW:tooltips_class32确实使用CS_DROPSHADOW – 您不会在窗口样式中看到它,因为它是一个类样式,而不是窗口样式。