I'm creating a non-intrusive popup window to notify the user when processing a time-consuming operation. At the moment I'm setting its transparency by calling SetLayeredWindowAttributes
which gives me a reasonable result:
alt text http://img6.imageshack.us/img6/3144/transparentn.jpg
However I'd like the text and close button to appear opaque (it doesn't quite look right with white text) while keeping the background transparent - is there a way of doing this?
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:
Bitmap
object with the PixelFormat32bppPARGB
pixel format.Graphics
object to draw in this Bitmap
object.Graphics
object created in step 2.GetHBITMAP
method on the Bitmap
object to get a Windows HBITMAP
.Bitmap
object.CreateCompatibleDC
and select the HBITMAP
from step 5 into it.UpdateLayeredWindow
using the memory DC as a source.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.