Win32的:如何使阴影荣誉非矩形分层窗口?
-
19-09-2019 - |
题
我已经创建了一个分层窗口中的所述 WS_EX_LAYERED 扩展样式:
wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;
Windows将使用黑色作为色度键颜色值。我要离开的黑色大边框,使明显的问题:
被构造的窗口
后,我告诉它使用黑色作为色度键颜色:
SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);
现在弹出分层窗口出现部分透明的:
问题是最后一步。我想使用 CS_DROPSHADOW 类样式,可用因为Windows XP中,创建一个下拉阴影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
出现阴影,但阴影围绕原始矩形窗口,并且不考虑由分层窗口提供的窗口的透明度:
有谁知道神奇的选项我在什么地方错过,这将使阴影兑现非矩形分层窗口?
的出现这个问题,即另一个例子是当不包括在6像素填充/余量。如从Windows®主题绘制的提示窗口非矩形。这留下一个小的可见间隙,其中窗口是透明的,但阴影不会出现:
微软已设法使其工作,因为你可以从Internet Explorer,这提示看:
寻找在一个Windows tooltips
类提示窗口更接近。使用 SpyXX - 我能得到它的窗口RECT和类样式:
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与XP添加CS_DropShadow
。解决方案
透明分层窗口被记录为在区域中的优选的技术。
然而,CS_DROPSHADOW
的不的关注区域。如果您裁剪或以其它方式使用区域塑造你的窗口,下拉式阴影将遵循新大纲。
幸运的是,你的可以的有分层的窗口,并通过结合两个用地区得到你要寻找的效果。
BTW:tooltips_class32的不的使用CS_DROPSHADOW - 你不会看到它的窗口风格,因为它是一个类的风格,而不是一个窗口样式
其他提示
你为什么不使用LWA_ALPHA和构建阴影到图像?
编辑在向效应初探您的评论:
A)使用α不停止你引导PNG仅一个阴影。 BLT的2个图像一起并且作为一个单一的图像使用。结果 B)它不是很难产生阴影。在图像,你公布了3个不同的α值黑色。结果 C),但它不工作,不是吗?即时间得到创造性。结果 d)那就不要试图让窗口做一些事情也不会为你做。结果 E)是完全不相干的。分层的窗口搞定你。点击
我强烈建议您了解更多有关分层的窗口,因为他们可以帮你你的目标。
EDIT2:你的位图。它很容易扫描整个图像,并发现该位将是色彩键控(通过识别黑色自己)和母鸡修改有0的阿尔法这里一切将有255(不阿尔法:您可能需要转换图像从一个较低的颜色格式的32位图像,你可以通过创建一个新的DC和复制图像)做到这一点。这会给你LWA_ALPHA与LWA_COLORKEY同样的效果。从那里它相当容易在边缘处,以识别所述像素,其中的颜色变化到(R = 0,G = 0,B = 0,A = 0)。然后,改变第一像素以具有192正α,它的一个打击128和一个下面〜64现在具有图像下方的alpha'd灰度,将看起来像的阴影。您可以调整阿尔法得到你想要的效果。
CS_DROPSHADOW
只适用于标准的矩形窗口。 WS_EX_LAYERED
窗口不支持一切。他们是一个比较低的水平,自助方法来绘制正是你想要的。
要得到一个阴影,你将有机会从图像中的alpha通道的下拉式隐藏你自己。