Click here to Skip to main content
15,889,281 members
Articles / Web Development / ASP.NET

How to make a transparent WinForm like a Vista form in VS2005

Rate me:
Please Sign up or sign in to vote.
3.93/5 (12 votes)
26 Aug 2006CPOL 337.3K   963   42   16
We can modify a WinForm's opacity in .NET, but we can not make a form like Vista form, whose header is transparent, but the rest of the form is not.

Sample Image - How_to_make_VistaForm.jpg

Introduction

This is article about how to make a transparent form in VS2005 like a Vista form. When I saw the Vista form the very first time, I started thinking about how to make a form like that. I searched a lot of web sites for a good solution, but didn't find an answer. Some guys told me to make a form using three different forms, but I think that is a crazy idea. We could do that, but I don't know how we cold then use it in a dialog model. I tried several ways to implement this form, and the solution I provide here is a good and simple one. I'm not really making the form transparent. The code follows. The most important part is the Graphics.CopyFromScreen method.

Source Code

C#
e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), 
           new Point(0, 0), new Size(this.Width, 23));
e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), 
           new Point(0, 0), new Size(3, this.Height));
e.Graphics.CopyFromScreen(this.PointToScreen(new Point(this.Width - 4, 0)), 
           new Point(this.Width - 4, 0), new Size(3, this.Height));
e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 
           this.Height - 4)), new Point(0, this.Height - 4), 
           new Size(this.Width, 3));

Key Point

C#
public GlassForm()
{
    InitializeComponent();
    //FocusForm = this;
    base.Padding = new Padding(4, 24, 5, 4);
    //this property is very important to make form repaint
    base.Opacity = 0.99;
    this.FormBorderStyle = FormBorderStyle.None;
    SetStyle(ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    SetStyle(ControlStyles.ResizeRedraw, true);
}
public new double Opacity
//we make a new Opcity property to stop any modify 
//of this property from outside
{
    get
    {
        return 1;
    }
}

protected override void OnPaint(PaintEventArgs e)
{ 
    base.OnPaint(e);
    e.Graphics.Clear(System.Drawing.Color.White);
    e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), 
                              new Point(0, 0), new Size(this.Width, 23));
    e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), 
                              new Point(0, 0), new Size(3, this.Height));
    e.Graphics.CopyFromScreen(this.PointToScreen(new Point(this.Width - 4, 0)), 
                              new Point(this.Width - 4, 0), 
                              new Size(3, this.Height));
    e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 
                              this.Height - 4)), 
                              new Point(0, this.Height - 4), 
                              new Size(this.Width, 3));
    if (FocusForm==this)
    {
        e.Graphics.FillRectangle(new SolidBrush(
                   this.ColorSetting.ActiveHeaderColor),
        new Rectangle(new Point(0, 0), this.Size));
    }
    else
    {
        e.Graphics.FillRectangle(new SolidBrush(
                   this.ColorSetting.HeaderColor),
        new Rectangle(new Point(0, 0), this.Size));
    }

    //.HighQuality;
    e.Graphics.SmoothingMode = 
         System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
    System.Drawing.Drawing2D.GraphicsPath path = 
           new System.Drawing.Drawing2D.GraphicsPath();

    path.AddLine(2, 0, this.Width - 4, 0);
    path.AddLine(this.Width - 4, 0, this.Width - 2, 2);
    path.AddLine(this.Width - 2, 2, this.Width - 2, this.Height - 4);
    path.AddLine(this.Width - 2, this.Height - 4, 
                 this.Width - 4, this.Height - 2);
    path.AddLine(this.Width - 4, this.Height - 2, 2, this.Height - 2);
    path.AddLine(2, this.Height - 2, 0, this.Height - 4);
    path.AddLine(0, this.Height - 4, 0, 2);
    path.AddLine(0, 2, 2, 0);

    System.Drawing.Drawing2D.GraphicsPath pathFrame = 
         new System.Drawing.Drawing2D.GraphicsPath();

    pathFrame.AddLine(2, 0, this.Width - 3, 0);
    pathFrame.AddLine(this.Width - 3, 0, this.Width - 1, 2);
    pathFrame.AddLine(this.Width - 1, 2, this.Width - 1, this.Height - 3);
    pathFrame.AddLine(this.Width - 1, this.Height - 4, 
                      this.Width - 4, this.Height - 1);
    pathFrame.AddLine(this.Width - 4, this.Height - 1, 2, this.Height - 1);
    pathFrame.AddLine(2, this.Height - 1, 0, this.Height - 4);
    pathFrame.AddLine(0, this.Height - 4, 0, 2);
    pathFrame.AddLine(0, 2, 2, 0);

    this.Region = new Region(pathFrame);
    //e.Graphics.FillPath(new SolidBrush(Color.FromArgb(30,
    //                    this.HeaderColor)), pathFrame);
    this.BackColor = this.ColorSetting.BackColor;

    if (FocusForm == this)
        e.Graphics.DrawPath(new 
             Pen(this.ColorSetting.ActiveBorderColor), path);
    else
        e.Graphics.DrawPath(new Pen(this.ColorSetting.BorderColor), path);
    Rectangle clientRegion = new Rectangle(3, 23, 
                             this.Width - 8, this.Height - 28);
    e.Graphics.FillRectangle(new SolidBrush(
               this.ColorSetting.BackColor), clientRegion);

    if (FocusForm == this)
        e.Graphics.DrawRectangle(new 
            Pen(this.ColorSetting.ActiveBorderColor), clientRegion);
    else
        e.Graphics.DrawRectangle(new 
            Pen(this.ColorSetting.BorderColor), clientRegion);
    if(this.BackgroundImage!=null)
        e.Graphics.DrawImage(this.BackgroundImage, clientRegion);
    if(this.Icon!=null)
        e.Graphics.DrawIcon(this.Icon, new Rectangle(3, 3, 16, 16));

    Font f = new Font("ArialBlack", (float)9,FontStyle.Bold);
    e.Graphics.DrawString(this.Text, f, Brushes.White, 21, 3);
    e.Graphics.DrawString(this.Text, f, Brushes.White, 23, 3);
    e.Graphics.DrawString(this.Text, f, Brushes.White, 22, 2);
    e.Graphics.DrawString(this.Text, f, Brushes.White, 22, 4);
    e.Graphics.DrawString(this.Text, f, Brushes.Black, 22, 3);

    if (this.IsMinOn)
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.MinHigh,
            this.MinRegion.GetBounds(e.Graphics));
    }
    else
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.Min,
            this.MinRegion.GetBounds(e.Graphics));
    }
    if (this.IsCloseOn)
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.CloseHigh,
            this.CloseRegion.GetBounds(e.Graphics));
    }
    else
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.Close,
            this.CloseRegion.GetBounds(e.Graphics));
    }
    if (this.IsMaxOn)
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.MaxHigh,
            this.MaxRegion.GetBounds(e.Graphics));
    }
    else
    {
        e.Graphics.DrawImage(
            global::Sayes.Controls.Vista.Properties.Resources.Max,
            this.MaxRegion.GetBounds(e.Graphics));
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
China China
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 5 Pin
develophope3-Feb-11 19:28
develophope3-Feb-11 19:28 
General还是我们中国人厉害啊 哈哈 Pin
iwanna_20102-Feb-10 14:25
iwanna_20102-Feb-10 14:25 
GeneralRe: 还是我们中国人厉害啊 哈哈 Pin
WillCaptain2-Feb-10 14:32
WillCaptain2-Feb-10 14:32 
GeneralRe: 还是我们中国人厉害啊 哈哈 Pin
xuechengang@gmail.com14-Aug-14 21:48
xuechengang@gmail.com14-Aug-14 21:48 
Generallearned it!!! Pin
iwanna_20102-Feb-10 14:24
iwanna_20102-Feb-10 14:24 
Generalgreat! Pin
Kiko.176-Oct-09 16:18
professionalKiko.176-Oct-09 16:18 
GeneralGerat Article, Well Done Pin
Sean J Conway6-Oct-07 5:05
Sean J Conway6-Oct-07 5:05 
GeneralBasic version [modified] Pin
charlievs9-Dec-06 18:41
charlievs9-Dec-06 18:41 
GeneralRe: Basic version Pin
WillCaptain10-Dec-06 2:29
WillCaptain10-Dec-06 2:29 
GeneralRe: Basic version Pin
NianTzerLow14-Jan-07 6:48
NianTzerLow14-Jan-07 6:48 
GeneralCan't you just set the form's opacity level less than 100%... Pin
Jun Du7-Nov-06 10:47
Jun Du7-Nov-06 10:47 
GeneralRe: Can't you just set the form's opacity level less than 100%... Pin
WillCaptain10-Dec-06 2:28
WillCaptain10-Dec-06 2:28 
GeneralRe: Can't you just set the form's opacity level less than 100%... Pin
NianTzerLow14-Jan-07 6:42
NianTzerLow14-Jan-07 6:42 
GeneralResize Pin
Fogels1-Sep-06 4:25
Fogels1-Sep-06 4:25 
GeneralImpossible to read Pin
DABBee29-Aug-06 12:13
DABBee29-Aug-06 12:13 
GeneralRe: Impossible to read Pin
WillCaptain30-Aug-06 23:15
WillCaptain30-Aug-06 23:15 
I'll refresh the source code with enough comments as soon as possible


Thousands of miles from now on

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.