Win32: How to make drop shadow honor non-rectangular Layered window?

后端 未结 3 1622
北海茫月
北海茫月 2020-12-14 18:41

i\'ve created a layered window by adding the the WS_EX_LAYERED extended style:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows

相关标签:
3条回答
  • 2020-12-14 19:11

    Why don't you use LWA_ALPHA and build the shadow into the image?

    Edit in reponse to your comment:

    A) Doesn't stop you using an alpha channeled PNG for a shadow only. Blt the 2 images together and use as one single image.
    B) Its not hard to generate a drop shadow. In the image you posted its black with 3 different alpha values.
    C) But it doesn't work does it? ie Time to get creative.
    D) Then don't try and get windows to do something it won't do for you.
    E) Is entirely irrelevant. Layered windows handle that for you.

    I strongly recommend you learn more about layered windows because they CAN help you to your goal.

    Edit2: You have the bitmap. Its fairly easy to scan over the image and find which bits will be colour keyed (by identifying the black yourself) and hen modify that to have an alpha of 0 where everything else will have an alpha of 255 (Not: You may have to convert the image to a 32-bit image from a lower colour format, you can do this by creating a new DC and copying the image). This will give you the same effect with LWA_ALPHA as with LWA_COLORKEY. From there its fairly easy to identify the pixel at the edge, where the color changes to (R = 0, G = 0, B = 0, A = 0). You then change that first pixel to have a n alpha of 192, the one blow it to 128 and the one below to 64. You now have an alpha'd gradation below the image that will look like the shadow. You can adjust the alpha to get the effect you want.

    0 讨论(0)
  • 2020-12-14 19:13

    Transparent layered windows is documented as the preferred technique over regions.

    However, CS_DROPSHADOW does pay attention to regions. If you crop or otherwise shape your window using a region, the drop-shadow will follow the new outline.

    Fortunately, you can use regions with layered windows, and by combining the two get the effect you're looking for.

    BTW: tooltips_class32 does use CS_DROPSHADOW - you won't see it in the window styles because it's a class style, not a window style.

    0 讨论(0)
  • 2020-12-14 19:23

    CS_DROPSHADOW only works with standard rectangular windows. WS_EX_LAYERED windows don't support everything. They are more of a low-level, self-service method to draw exactly what you want.

    To get a drop shadow, you'll have to generate the drop-shadow yourself from the alpha channel in the image.

    0 讨论(0)
提交回复
热议问题