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.