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

时间:2010-02-08 19:20:38

标签: winapi dropshadow layered-windows ws-ex-layered

我通过添加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_SAVEBITS0x800);这对于小型,短命的窗户非常有用。

它也不使用CS_DROPSHADOW0x20000)。所以现在我想知道它是如何在自己的窗户之外绘制的?

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

编辑:分层Windows已经出现在Windows 2000中.CS_DropShadow添加了XP。

3 个答案:

答案 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通道生成阴影。