Click here to Skip to main content
15,880,543 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.1K   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 
nice work but I could'nt resize the form.
Btw please add some comments to your source.
10x
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 

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.