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.
透明分层窗口被记录为区域上的首选技术.
但是,CS_DROPSHADOW 确实要关注地区.如果使用区域裁剪或以其他方式塑造窗口,则阴影将跟随新轮廓.
幸运的是,您可以使用具有分层窗口的区域,并通过组合这两个区域获得您正在寻找的效果.
BTW:tooltips_class32 确实使用CS_DROPSHADOW - 你不会在窗口样式中看到它,因为它是一种类样式,而不是窗口样式.
| 归档时间: |
|
| 查看次数: |
7876 次 |
| 最近记录: |