In order to do "proper" alpha in a layered window you need to supply the window manager with a PARGB bitmap by a call to UpdateLayeredWindow
.
The cleanest way to achieve this that I know of is the following:
- Create a GDI+
Bitmap
object with the PixelFormat32bppPARGB
pixel format.
- Create a
Graphics
object to draw in this Bitmap
object.
- Do all your drawing into this object using GDI+.
- Destroy the
Graphics
object created in step 2.
- Call the
GetHBITMAP
method on the Bitmap
object to get a Windows HBITMAP
.
- Destroy the
Bitmap
object.
- Create a memory DC using
CreateCompatibleDC
and select the HBITMAP
from step 5 into it.
- Call UpdateLayeredWindow using the memory DC as a source.
- Select previous bitmap and delete the memory DC.
- Destroy the
HBITMAP
created in step 5.
This method should allow you to control the alpha channel of everything that is drawn: transparent for the background, opaque for the text and button.
Also, since you are going to be outputting text, I recommend that you call SystemParametersInfo
to get the default antialiasing setting (SPI_GETFONTSMOOTHING
), and then the SetTextRenderingHint
on the Graphics object to set the antialiasing type to the same type that is configured by the user, for a nicer look.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…