我通过添加layered window扩展样式创建了WS_EX_LAYERED:
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
问题是最后一步。我想使用自Windows XP以来可用的CS_DROPSHADOW类样式来创建一个阴影:
wndClass.Style = wndClass.Style | CS_DROPSHADOW;
出现投影,但阴影环绕原始矩形窗口,并未考虑分层窗口提供的窗口透明度:
http://i49.tinypic.com/23lnnu9.jpg
有谁知道我错过了什么神奇的选项会使投影尊重非矩形分层窗口?
出现此问题的另一个示例是当您不包含6px填充/边距时。由Windows®主题绘制的提示窗口是非矩形的。这会留下一个小的可见间隙,窗口是透明的,但不会出现阴影:
alt text http://i47.tinypic.com/30arsxk.png
Microsoft已设法使其正常工作,您可以从Internet Explorer的这一提示中看到:
alt text 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
所以一切都指向窗口本身是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已经出现在Windows 2000中.CS_DropShadow添加了XP。
答案 0 :(得分:6)
透明分层窗口被记录为区域内的首选技术。
但是,CS_DROPSHADOW
会关注区域。如果使用区域裁剪或以其他方式塑造窗口,则阴影将跟随新轮廓。
幸运的是,可以使用具有分层窗口的区域,并通过组合这两个区域来获得您正在寻找的效果。
BTW:tooltips_class32 使用CS_DROPSHADOW - 你不会在窗口样式中看到它,因为它是一种类样式,而不是窗口样式。
答案 1 :(得分:1)
为什么不使用LWA_ALPHA并在图像中构建阴影?
编辑以回应您的评论:
A)不会阻止您使用alpha通道PNG仅用于阴影。将2张图像叠加在一起并用作单张图像
B)不容易产生阴影。在图像中,您使用3种不同的alpha值发布了黑色
C)但它不起作用吗?即获得创意的时间
D)然后不要试图让窗户做一些它不会为你做的事情
E)完全无关紧要。分层窗户为您处理。
我强烈建议您了解有关分层窗口的更多信息,因为它们可以帮助您实现目标。
Edit2:你有位图。它很容易扫描图像,找到哪些位将被颜色键入(通过自己识别黑色),然后母鸡修改为alpha为0,其他一切将具有255的alpha值(不:你可能需要转换)将图像转换为较低颜色格式的32位图像,可以通过创建新DC并复制图像来完成此操作。这将使您获得与LWA_ALPHA相同的效果,与LWA_COLORKEY相同。从那里可以很容易地识别边缘处的像素,其中颜色变为(R = 0,G = 0,B = 0,A = 0)。然后,您将第一个像素更改为具有192的n alpha,一个将其吹制为128,将下一个像素更改为64.现在,您在图像下方会有一个看起来像阴影的alphad渐变。您可以调整alpha以获得所需的效果。
答案 2 :(得分:1)
CS_DROPSHADOW
仅适用于标准矩形窗口。 WS_EX_LAYERED
窗口不支持所有内容。它们更像是一种低级别的自助式方法,可以准确地绘制出你想要的东西。
要获得投影,您必须自己从图像中的Alpha通道生成阴影。