Win32:如何使投影荣耀非矩形分层窗口?

Ian*_*oyd 17 winapi layered-windows ws-ex-layered dropshadow

我通过添加WS_EX_LAYERED扩展样式创建了一个分层窗口:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Run Code Online (Sandbox Code Playgroud)

Windows将使用黑色作为色度键颜色值.我要留下一个黑色的大边框,以使问题显而易见:

替代文字http://i45.tinypic.com/2qs002q.jpg


构建窗口后,我告诉它使用黑色作为色度键颜色:

SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
Run Code Online (Sandbox Code Playgroud)

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

替代文字http://i48.tinypic.com/2cfta3o.jpg


问题是最后一步.我想使用自Windows XP以来可用的CS_DROPSHADOW类样式来创建一个阴影:

wndClass.Style = wndClass.Style | CS_DROPSHADOW;
Run Code Online (Sandbox Code Playgroud)

出现阴影,但阴影围绕原始矩形窗口,并没有考虑分层窗口提供的窗口透明度:

http://i49.tinypic.com/23lnnu9.jpg

有谁知道我错过了什么神奇的选项,将使投影荣耀非矩形分层窗口?


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

替代文字http://i47.tinypic.com/30arsxk.png

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

替代文字http://i46.tinypic.com/f104cj.jpg


仔细观察Windows tooltips类提示窗口.使用SpyXX - 我可以得到它的窗口rect和类样式:

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
Run Code Online (Sandbox Code Playgroud)

所以一切都指向窗口本身是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
Run Code Online (Sandbox Code Playgroud)

有趣的是,它不使用CS_SAVEBITS(0x800); 这对于小型,短命的窗户很有用.

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

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

编辑:分层Windows已经与Windows 2000一起使用.CS_DropShadow添加了XP.

Sho*_*og9 6

透明分层窗口被记录为区域上的首选技术.

但是,CS_DROPSHADOW 确实要关注地区.如果使用区域裁剪或以其他方式塑造窗口,则阴影将跟随新轮廓.

幸运的是,您可以使用具有分层窗口的区域,并通过组合这两个区域获得您正在寻找的效果.

BTW:tooltips_class32 确实使用CS_DROPSHADOW - 你不会在窗口样式中看到它,因为它是一种类样式,而不是窗口样式.