winapi – Win32:如何使阴影荣誉非矩形分层窗口?

我通过添加WS_EX_LAYERED扩展样式创建了一个layered window

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, 229)-(544, 249), 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 – 您不会在窗口样式中看到它,因为它是一个类样式,而不是窗口样式。

http://stackoverflow.com/questions/2224220/win32-how-to-make-drop-shadow-honor-non-rectangular-layered-window

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:winapi – Win32:如何使阴影荣誉非矩形分层窗口?