Click here to Skip to main content
15,868,142 members
Articles / Desktop Programming / Windows Forms
Article

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

Rate me:
Please Sign up or sign in to vote.
4.49/5 (28 votes)
23 Feb 2006CDDL2 min read 191.3K   2.5K   81   42
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.

Image 1

Image 2

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).

Image 3

Using the class

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

C#
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.

C#
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#).

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.

MC++
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)


Written By
United States United States
Nish Nishant is a technology enthusiast from Columbus, Ohio. He has over 20 years of software industry experience in various roles including Chief Technology Officer, Senior Solution Architect, Lead Software Architect, Principal Software Engineer, and Engineering/Architecture Team Leader. Nish is a 14-time recipient of the Microsoft Visual C++ MVP Award.

Nish authored C++/CLI in Action for Manning Publications in 2005, and co-authored Extending MFC Applications with the .NET Framework for Addison Wesley in 2003. In addition, he has over 140 published technology articles on CodeProject.com and another 250+ blog articles on his WordPress blog. Nish is experienced in technology leadership, solution architecture, software architecture, cloud development (AWS and Azure), REST services, software engineering best practices, CI/CD, mentoring, and directing all stages of software development.

Nish's Technology Blog : voidnish.wordpress.com

Comments and Discussions

 
GeneralI think XP SP3 might have broken this Pin
jrizzo@langan.com30-Mar-09 9:33
jrizzo@langan.com30-Mar-09 9:33 
QuestionGreat;Possible to return DialogResult? Pin
Mathiyazhagan22-Jan-09 19:54
Mathiyazhagan22-Jan-09 19:54 
GeneralDoes not work in Vista Pin
bobfox7-Aug-08 11:53
professionalbobfox7-Aug-08 11:53 
GeneralMessage Closed Pin
4-Sep-08 5:03
mayurmv4-Sep-08 5:03 
GeneralRe: Does not work in Vista Pin
tom94-Jan-09 0:33
tom94-Jan-09 0:33 
QuestionVB6 Pin
John Mackay14-Feb-07 15:52
John Mackay14-Feb-07 15:52 
QuestionGrayed out Pin
BillyDisMe21-Dec-06 10:49
BillyDisMe21-Dec-06 10:49 
Generalvisual basic 6 classic Pin
TheCardinal4-Aug-06 1:21
TheCardinal4-Aug-06 1:21 
GeneralCool Pin
Paul Conrad25-Feb-06 7:59
professionalPaul Conrad25-Feb-06 7:59 
GeneralRe: Cool Pin
Nish Nishant2-Mar-06 5:58
sitebuilderNish Nishant2-Mar-06 5:58 
GeneralDual Monitors Pin
DaveHoganIW24-Feb-06 0:37
DaveHoganIW24-Feb-06 0:37 
GeneralRe: Dual Monitors Pin
Nish Nishant24-Feb-06 1:03
sitebuilderNish Nishant24-Feb-06 1:03 
GeneralRe: Dual Monitors Pin
DaveHoganIW24-Feb-06 1:48
DaveHoganIW24-Feb-06 1:48 
GeneralRe: Dual Monitors Pin
Nish Nishant24-Feb-06 2:10
sitebuilderNish Nishant24-Feb-06 2:10 
GeneralRe: Dual Monitors Pin
DaveHoganIW24-Feb-06 3:27
DaveHoganIW24-Feb-06 3:27 
GeneralRe: Dual Monitors Pin
Nish Nishant24-Feb-06 3:28
sitebuilderNish Nishant24-Feb-06 3:28 
GeneralRe: Dual Monitors Pin
DaveHoganIW24-Feb-06 3:41
DaveHoganIW24-Feb-06 3:41 
GeneralRe: Dual Monitors Pin
Nish Nishant24-Feb-06 4:44
sitebuilderNish Nishant24-Feb-06 4:44 
GeneralRe: Dual Monitors Pin
Michael Dunn2-Mar-06 20:56
sitebuilderMichael Dunn2-Mar-06 20:56 
GeneralRe: Dual Monitors Pin
Nish Nishant3-Mar-06 1:09
sitebuilderNish Nishant3-Mar-06 1:09 
Generalguuuuuud Pin
toxcct23-Feb-06 23:16
toxcct23-Feb-06 23:16 
GeneralRe: guuuuuud Pin
Nish Nishant24-Feb-06 1:04
sitebuilderNish Nishant24-Feb-06 1:04 
GeneralNo desktop switching Pin
Thomas Weidenmueller23-Feb-06 12:44
Thomas Weidenmueller23-Feb-06 12:44 
GeneralRe: No desktop switching Pin
Nish Nishant23-Feb-06 12:52
sitebuilderNish Nishant23-Feb-06 12:52 
GeneralRe: No desktop switching Pin
Thomas Weidenmueller23-Feb-06 13:33
Thomas Weidenmueller23-Feb-06 13:33 

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.