Click here to Skip to main content
Click here to Skip to main content

Producing translucent dialog boxes and windows without flickering

By , 6 Aug 2002
 

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

About the Author

-Kirill-
Web Developer
Germany Germany
Member
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.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralVery Nice, it even works with MSDev 4.2bmemberbinyo6628 Jun '09 - 17:37 
GeneralIf the background application is windows media player,it can not transparentmemberzseasoft13 Oct '07 - 22:22 
GeneralWell donememberDr.Luiji29 Aug '07 - 22:17 
QuestionBug in this approach - is there a work aroundmembervenki_rtz17 Jan '07 - 22:03 
QuestionCan have 100% opaque window text while 70% transparent window background? [modified]memberAlexandru30 May '06 - 23:40 
GeneralProb w/ Translucent window overlapped with DirectX Windowmembersurmitha20 Dec '05 - 8:17 
GeneralRe: Prob w/ Translucent window overlapped with DirectX Windowmember-Kirill-20 Dec '05 - 9:58 
Generalwhy SetLayeredWindowAttributes can't used in 8 bits(256) for Win2kmemberwhizzkid@ms28.hinet.net11 Aug '04 - 12:02 
who can solve this problem...
why SetLayeredWindowAttributes can't used in 8 bits(256) color quality.
please tell me, thanks.

QuestionHow can this be implemented in VB.NET?memberPC3700DDR4 May '04 - 13:43 
AnswerRe: How can this be implemented in VB.NET?member-Kirill-5 May '04 - 11:08 
GeneralRe: How can this be implemented in VB.NET?memberPC3700DDR23 May '04 - 10:44 
Generalit can't do anything for a subwindow(control) in a dialogsussAnonymous27 Sep '02 - 16:22 
GeneralRe: it can't do anything for a subwindow(control) in a dialogmember-Kirill-27 Sep '02 - 16:49 
GeneralRe: it can't do anything for a subwindow(control) in a dialogmemberskygg9 Jun '03 - 2:35 
GeneralRe: it can't do anything for a subwindow(control) in a dialogmember-Kirill-9 Jun '03 - 5:47 
GeneralWin Ver...memberCDotNetUser14 Aug '02 - 13:45 
GeneralRe: Win Ver...memberCDotNetUser15 Aug '02 - 5:09 
GeneralSome restrictions...sussMykel7 Aug '02 - 21:12 
GeneralRe: Some restrictions...memberCDotNetUser14 Aug '02 - 13:37 
GeneralRe: Some restrictions...suss-Kirill-14 Aug '02 - 15:00 
QuestionDo I need Platform SDK ?memberAnthony_Yio7 Aug '02 - 17:28 
AnswerRe: Do I need Platform SDK ?suss-Kirill-14 Aug '02 - 14:48 

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 7 Aug 2002
Article Copyright 2002 by -Kirill-
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid