Click here to Skip to main content
Click here to Skip to main content
Go to top

Producing translucent dialog boxes and windows without flickering

, 6 Aug 2002
Rate this:
Please Sign up or sign in to vote.
Enhancing window fade-in to render common controls correctly and to allow the window to remain transparent after the fade-in

Problem

The AnimateWindow() API with the AW_BLEND parameter is supposed to fade in and out windows smoothly. Basically, it has two drawbacks:
  1. Text and ListView controls (and several others) aren't rendered correctly during fade-in.
  2. You cannot specify a translucency for the window, i.e., after the animation is over, the window is opaque.
Clicking 'No' in the sample project demonstrates both problems.

Workaround?

There seemed to be a simple workaround for this: Adding the WS_EX_LAYERED extended style to the window and calling SetLayeredWindowAttributes() with the desired alpha value, as described in the MSDN Library and in various other sources. Unfortunately, this didn't work either, at least on my XP Pro system. The code produced a very nasty flickering: the window area was initially black.

Solution

The following code shows how to fade in a dialog to a predefinded translucency without flickering:
INT_PTR CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  ) 
{
   RECT rcDesktop;
   RECT rcMe;

   BYTE bTranslucency;

   const DWORD ANIMATION_MILLIS = 200;
   const BYTE TRANSLUCENCY = 192;
   const BYTE TRANSLUCENCY_STEP = 16;
   const DWORD TRANSLUCENCY_TIMEOUT 
      = TRANSLUCENCY_STEP * ANIMATION_MILLIS / TRANSLUCENCY;

   switch (uMsg) {
   case WM_INITDIALOG:
      // Make it a layered window.
      ::SetWindowLong(hwndDlg, GWL_EXSTYLE,
         ::GetWindowLong(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED);

      // Completely transparent window - note the third parameter
      ::SetLayeredWindowAttributes(hwndDlg, 0, 0, LWA_ALPHA);

      // Show it _first_
      ::ShowWindow(hwndDlg, SW_SHOW);

      // Redraw contents NOW - no flickering since the window's not visible
      ::RedrawWindow(hwndDlg, NULL, NULL, RDW_UPDATENOW); 

      // Normally, you would use a timer here...
      for (bTranslucency = 0; bTranslucency < TRANSLUCENCY;
      bTranslucency+=TRANSLUCENCY_STEP) {
         // Adjust the translucency
         ::SetLayeredWindowAttributes(hwndDlg, 0, bTranslucency, LWA_ALPHA);

         // Wait
         ::Sleep(TRANSLUCENCY_TIMEOUT);
      }

      // Set the final translucency
      ::SetLayeredWindowAttributes(hwndDlg, 0, bTranslucency, LWA_ALPHA);
      break;
   }

   return 0;
}
Note that the call to ShowWindow() is usually done by the CreateDialogXXX() functions if the dialog template has the WS_VISIBLE style set. For our purposes, we have to do it right here in response to the WM_INITDIALOG message.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

-Kirill-
Web Developer
Germany Germany
Kirill lives in Berlin (Germany). The name comes from Russia where he was born and where he spent about eight years.
 
He started with a C64. Soon, he found out that BASIC is as slow as it is simple, and started to learn Assembler which revealed the "true power" of this computer.
 
After a while, a 486 was bought. He started to learn C/C++ and Pascal and to learn about algorithms and data structures.
 
Currently, he is studying computer sciences at TU Karlsruhe and working for orgAnice Software GmbH as developer.
 
He enjoys playing badminton and pool billards.

Comments and Discussions

 
GeneralVery Nice, it even works with MSDev 4.2b Pinmemberbinyo6628-Jun-09 17:37 
GeneralIf the background application is windows media player,it can not transparent Pinmemberzseasoft13-Oct-07 22:22 
GeneralWell done PinmemberDr.Luiji29-Aug-07 22:17 
QuestionBug in this approach - is there a work around Pinmembervenki_rtz17-Jan-07 22:03 
QuestionCan have 100% opaque window text while 70% transparent window background? [modified] PinmemberAlexandru30-May-06 23:40 
GeneralProb w/ Translucent window overlapped with DirectX Window Pinmembersurmitha20-Dec-05 8:17 
Hi,
I am having problems overlapping Translucent windows over any DirectX window.
It flickers crazily whether I put the timer as suggested in this code or whether I dont put the timer and follow the simple rules of MSDN.
 
This happened on my both computers at home - ATI Rage Turbo Pro card and also Intel Integrated Gfx.
 
Any suggestions? This is very urgent please. I have a deliverable by the end of the year Frown | :(
 
Thank you
GeneralRe: Prob w/ Translucent window overlapped with DirectX Window Pinmember-Kirill-20-Dec-05 9:58 
Generalwhy SetLayeredWindowAttributes can't used in 8 bits(256) for Win2k Pinmemberwhizzkid@ms28.hinet.net11-Aug-04 12:02 
QuestionHow can this be implemented in VB.NET? PinmemberPC3700DDR4-May-04 13:43 
AnswerRe: How can this be implemented in VB.NET? Pinmember-Kirill-5-May-04 11:08 
GeneralRe: How can this be implemented in VB.NET? PinmemberPC3700DDR23-May-04 10:44 
Generalit can't do anything for a subwindow(control) in a dialog PinsussAnonymous27-Sep-02 16:22 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pinmember-Kirill-27-Sep-02 16:49 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pinmemberskygg9-Jun-03 2:35 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pinmember-Kirill-9-Jun-03 5:47 
GeneralWin Ver... PinmemberCDotNetUser14-Aug-02 13:45 
GeneralRe: Win Ver... PinmemberCDotNetUser15-Aug-02 5:09 
GeneralSome restrictions... PinsussMykel7-Aug-02 21:12 
GeneralRe: Some restrictions... PinmemberCDotNetUser14-Aug-02 13:37 
GeneralRe: Some restrictions... Pinsuss-Kirill-14-Aug-02 15:00 
QuestionDo I need Platform SDK ? PinmemberAnthony_Yio7-Aug-02 17:28 
AnswerRe: Do I need Platform SDK ? Pinsuss-Kirill-14-Aug-02 14:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.140916.1 | Last Updated 7 Aug 2002
Article Copyright 2002 by -Kirill-
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid