Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
228 views
in Technique[技术] by (71.8m points)

c++ - Transparent window containing opaque text and buttons

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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:

  1. Create a GDI+ Bitmap object with the PixelFormat32bppPARGB pixel format.
  2. Create a Graphics object to draw in this Bitmap object.
  3. Do all your drawing into this object using GDI+.
  4. Destroy the Graphics object created in step 2.
  5. Call the GetHBITMAP method on the Bitmap object to get a Windows HBITMAP.
  6. Destroy the Bitmap object.
  7. Create a memory DC using CreateCompatibleDC and select the HBITMAP from step 5 into it.
  8. Call UpdateLayeredWindow using the memory DC as a source.
  9. Select previous bitmap and delete the memory DC.
  10. 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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...