Click here to Skip to main content
15,879,326 members
Articles / Desktop Programming / MFC
Article

Producing translucent dialog boxes and windows without flickering

Rate me:
Please Sign up or sign in to vote.
4.94/5 (11 votes)
6 Aug 2002 133.4K   3.1K   41   22
Enhancing window fade-in to render common controls correctly and to allow the window to remain transparent after the fade-in

Image 1

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


Written By
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 Pin
binyo6628-Jun-09 17:37
binyo6628-Jun-09 17:37 
GeneralIf the background application is windows media player,it can not transparent Pin
zseasoft13-Oct-07 22:22
zseasoft13-Oct-07 22:22 
GeneralWell done Pin
Dr.Luiji29-Aug-07 22:17
professionalDr.Luiji29-Aug-07 22:17 
QuestionBug in this approach - is there a work around Pin
venkigdl17-Jan-07 22:03
venkigdl17-Jan-07 22:03 
QuestionCan have 100% opaque window text while 70% transparent window background? [modified] Pin
Alexandru Matei30-May-06 23:40
Alexandru Matei30-May-06 23:40 
GeneralProb w/ Translucent window overlapped with DirectX Window Pin
surmitha20-Dec-05 8:17
surmitha20-Dec-05 8:17 
GeneralRe: Prob w/ Translucent window overlapped with DirectX Window Pin
-Kirill-20-Dec-05 9:58
-Kirill-20-Dec-05 9:58 
Generalwhy SetLayeredWindowAttributes can't used in 8 bits(256) for Win2k Pin
Eureka Jim11-Aug-04 12:02
Eureka Jim11-Aug-04 12:02 
QuestionHow can this be implemented in VB.NET? Pin
PC3700DDR4-May-04 13:43
PC3700DDR4-May-04 13:43 
AnswerRe: How can this be implemented in VB.NET? Pin
-Kirill-5-May-04 11:08
-Kirill-5-May-04 11:08 
GeneralRe: How can this be implemented in VB.NET? Pin
PC3700DDR23-May-04 10:44
PC3700DDR23-May-04 10:44 
Generalit can't do anything for a subwindow(control) in a dialog Pin
Anonymous27-Sep-02 16:22
Anonymous27-Sep-02 16:22 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pin
-Kirill-27-Sep-02 16:49
-Kirill-27-Sep-02 16:49 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pin
skygg9-Jun-03 2:35
skygg9-Jun-03 2:35 
GeneralRe: it can't do anything for a subwindow(control) in a dialog Pin
-Kirill-9-Jun-03 5:47
-Kirill-9-Jun-03 5:47 
GeneralWin Ver... Pin
CDotNetUser14-Aug-02 13:45
CDotNetUser14-Aug-02 13:45 
GeneralRe: Win Ver... Pin
CDotNetUser15-Aug-02 5:09
CDotNetUser15-Aug-02 5:09 
GeneralSome restrictions... Pin
sps-itsec467-Aug-02 21:12
sps-itsec467-Aug-02 21:12 
GeneralRe: Some restrictions... Pin
CDotNetUser14-Aug-02 13:37
CDotNetUser14-Aug-02 13:37 
GeneralRe: Some restrictions... Pin
-Kirill-14-Aug-02 15:00
-Kirill-14-Aug-02 15:00 
QuestionDo I need Platform SDK ? Pin
Anthony_Yio7-Aug-02 17:28
Anthony_Yio7-Aug-02 17:28 
AnswerRe: Do I need Platform SDK ? Pin
-Kirill-14-Aug-02 14:48
-Kirill-14-Aug-02 14:48 

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

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