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

A modal dialog that fades the background to gray-scale imitating the XP shutdown screen

By , 23 Feb 2006
 

Introduction

DimmerDialog is a .NET class that shows a modal dialog which grays out the rest of the background, just like the Windows XP Shutdown dialog. This can be used when your application needs to show a very important message box or form that requires immediate user attention. The class allows you to show either a message box (where you can set the text, title and icon), or a Form instance.

How the class works

The XP Shutdown dialog shows a modal form, while the background fades to gray-scale. I've tried to simulate this, though my fading is not as smooth or impressive (I've used regular GDI stuff whereas the XP Shutdown dialog may have used more powerful techniques like DirectX). I create a new desktop (named with a GUID), switch to this desktop, show the background, fade it using a timer, and all this while the modal form or message box is kept on top. Here's an animated gif that shows the fading effect (quality is poor due to GIF color depth limitations).

Using the class

Here's some sample code that shows how you can show a message-box.

private void button2_Click(object sender, EventArgs e)
{
    DimmerDialog dimmer = new DimmerDialog();
    dimmer.ShowMessageBox(
        "You can show either a Form or a MessageBox here.", 
        "Fatal Error has occurred", MessageBoxIcon.Stop);
}

And here's some code that shows how to show a form.

private void button1_Click(object sender, EventArgs e)
{
    DimmerDialog dimmer = new DimmerDialog();
    dimmer.ShowForm(new Form2());
}

When you show a form, make sure that your form does not start any process (as a button click action for instance), because that process will run on your primary desktop and not on this desktop. It's best to keep things simple (like the XP shutdown dialog has) and to merely use the form to collect some data.

Class implementation

The class was written in mixed mode C++/CLI, but here's what the public interface looks like in C# (simulated - actual code is not in C#).

public class DimmerDialog
{
    public DimmerDialog();
    public void ShowForm(Form form);
    public void ShowMessageBox(string text, string title,
        MessageBoxIcon icon);
}

Here's the fade function I wrote (it's C++), where the final gray-scaling code is a rip out of one of  Christian's GDI+ articles. The fading algorithm is one I finalized on after some trial and error. It's far from perfect, but I thought this will do, considering the utility we get out of the fading effect.

Bitmap^ DimBitmap()
{
  if(m_ColorReductionStep == 0)
    return m_Image;
  Bitmap^ imagecopy = (Bitmap^)m_Image->Clone();
  BitmapData^ bmData = imagecopy->LockBits(
    System::Drawing::Rectangle(0, 0, 
    imagecopy->Width, imagecopy->Height), 
    ImageLockMode::ReadWrite, PixelFormat::Format24bppRgb); 
  BYTE* p = (BYTE*)bmData->Scan0.ToPointer();
  int nOffset = bmData->Stride - imagecopy->Width * 3; 
  BYTE red, green, blue;
  for(int y=0; y < imagecopy->Height; y++)
  {
    for(int x=0; x < imagecopy->Width; x++)
    {
      blue = p[0];
      green = p[1];
      red = p[2];

      switch(m_ColorReductionStep)
      {
      case 1:
        p[0]  = (BYTE)(.001 * red + .286 * green + .713 * blue);
        p[1]  = (BYTE)(.001 * red + .986 * green + .013 * blue);
        p[2]  = (BYTE)(.899 * red + .087 * green + .013 * blue);
        break;
      case 2:
        p[0]  = (BYTE)(.099 * red + .387 * green + .514 * blue);
        p[1]  = (BYTE)(.099 * red + .887 * green + .014 * blue);
        p[2]  = (BYTE)(.699 * red + .287 * green + .013 * blue);
        break;
      case 3:
        p[0]  = (BYTE)(.199 * red + .487 * green + .314 * blue);
        p[1]  = (BYTE)(.199 * red + .787 * green + .014 * blue);
        p[2]  = (BYTE)(.499 * red + .487 * green + .014 * blue);
        break;
      case 4:
        p[0] = p[1] = p[2] = (BYTE)(.299 * red + .587 * green + .114 * blue);
        break;
      }         
      p += 3;
    }
    p += nOffset;
  }
  imagecopy->UnlockBits(bmData);
  return imagecopy;
}

Don't even ask me why I used those fractions, I just got them after various attempts. Perhaps by modifying them, and by adding more steps (currently I use a 4-step fading), we might be able to get a smoother effect, but I didn't think it worth the effort.

History

  • Feb 23 2006 - Article first published.

License

This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)

About the Author

Nish Sivakumar

United States United States
Nish is a real nice guy who has been writing code since 1990 when he first got his hands on an 8088 with 640 KB RAM. Originally from sunny Trivandrum in India, he has been living in various places over the past few years and often thinks it’s time he settled down somewhere.
 
Nish has been a Microsoft Visual C++ MVP since October, 2002 - awfully nice of Microsoft, he thinks. He maintains an MVP tips and tricks web site - www.voidnish.com where you can find a consolidated list of his articles, writings and ideas on VC++, MFC, .NET and C++/CLI. Oh, and you might want to check out his blog on C++/CLI, MFC, .NET and a lot of other stuff - blog.voidnish.com.
 
Nish loves reading Science Fiction, P G Wodehouse and Agatha Christie, and also fancies himself to be a decent writer of sorts. He has authored a romantic comedy Summer Love and Some more Cricket as well as a programming book – Extending MFC applications with the .NET Framework.
 
Nish's latest book C++/CLI in Action published by Manning Publications is now available for purchase. You can read more about the book on his blog.
 
Despite his wife's attempts to get him into cooking, his best effort so far has been a badly done omelette. Some day, he hopes to be a good cook, and to cook a tasty dinner for his wife.

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   
NewsC# users may find this helpfulmemberMember 419655026-Sep-09 8:32 
GeneralI think XP SP3 might have broken thismemberjrizzo@langan.com30-Mar-09 9:33 
QuestionGreat;Possible to return DialogResult?memberMember 409275322-Jan-09 19:54 
GeneralDoes not work in Vistamemberbobfox7-Aug-08 11:53 
GeneralRe: Does not work in Vistamembermayurmv4-Sep-08 5:03 
GeneralRe: Does not work in Vistamembertom94-Jan-09 0:33 
QuestionVB6memberJohn Mackay14-Feb-07 15:52 
QuestionGrayed outmemberBillyDisMe21-Dec-06 10:49 
Do you believe it possible to persist the grayscale effect permanently? As a theme perhaps? Thanks.
Generalvisual basic 6 classicmemberTheCardinal4-Aug-06 1:21 
GeneralCoolmembercomputerguru9238225-Feb-06 7:59 
GeneralRe: CoolstaffNishant Sivakumar2-Mar-06 5:58 
GeneralDual MonitorsmemberH0G4N24-Feb-06 0:37 
GeneralRe: Dual MonitorsstaffNishant Sivakumar24-Feb-06 1:03 
GeneralRe: Dual MonitorsmemberH0G4N24-Feb-06 1:48 
GeneralRe: Dual MonitorsstaffNishant Sivakumar24-Feb-06 2:10 
GeneralRe: Dual MonitorsmemberH0G4N24-Feb-06 3:27 
GeneralRe: Dual MonitorsstaffNishant Sivakumar24-Feb-06 3:28 
GeneralRe: Dual MonitorsmemberH0G4N24-Feb-06 3:41 
GeneralRe: Dual MonitorsstaffNishant Sivakumar24-Feb-06 4:44 
GeneralRe: Dual MonitorssitebuilderMichael Dunn2-Mar-06 20:56 
GeneralRe: Dual MonitorsstaffNishant Sivakumar3-Mar-06 1:09 
Generalguuuuuudmembertoxcct23-Feb-06 23:16 
GeneralRe: guuuuuudstaffNishant Sivakumar24-Feb-06 1:04 
GeneralNo desktop switchingmemberThomas Weidenmueller23-Feb-06 12:44 
GeneralRe: No desktop switchingstaffNishant Sivakumar23-Feb-06 12:52 
GeneralRe: No desktop switchingmemberThomas Weidenmueller23-Feb-06 13:33 
GeneralRe: No desktop switchingmemberRama Krishna Vavilala23-Feb-06 13:45 
GeneralRe: No desktop switchingstaffNishant Sivakumar23-Feb-06 14:02 
GeneralRe: No desktop switchingstaffNishant Sivakumar23-Feb-06 14:02 
GeneralRe: No desktop switchingmembermr.stick24-Feb-06 1:19 
GeneralRe: No desktop switchingstaffNishant Sivakumar24-Feb-06 2:11 
GeneralRe: No desktop switchingstaffNishant Sivakumar23-Feb-06 14:06 
GeneralThat's some interesting codeprotectorMarc Clifton23-Feb-06 12:03 
GeneralRe: That's some interesting codestaffNishant Sivakumar23-Feb-06 12:20 
AnswerRe: That's some interesting codememberWilli Deutschmann24-Feb-06 5:48 
GeneralRe: That's some interesting codesitebuilderShog93-Mar-06 6:03 
GeneralRe: That's some interesting codemembertombala18-Mar-06 17:45 
GeneralRe: That's some interesting codestaffNishant Sivakumar23-Feb-06 12:33 
GeneralRe: That's some interesting codeprotectorMarc Clifton23-Feb-06 12:59 
GeneralRe: That's some interesting codestaffNishant Sivakumar23-Feb-06 13:00 
GeneralRe: That's some interesting codeprotectorMarc Clifton23-Feb-06 13:15 
GeneralRe: That's some interesting codestaffNishant Sivakumar23-Feb-06 14:07 
GeneralRe: That's some interesting codeprotectorMarc Clifton23-Feb-06 15:56 

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

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130619.1 | Last Updated 23 Feb 2006
Article Copyright 2006 by Nish Sivakumar
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid