Click here to Skip to main content
Licence CPOL
First Posted 26 Aug 2006
Views 63,836
Downloads 435
Bookmarked 38 times

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

By | 26 Aug 2006 | Article
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

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

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)

About the Author

WillCaptain



China China

Member



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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 Pinmemberliusvelss19:28 3 Feb '11  
General还是我们中国人厉害啊 哈哈 Pinmemberiwanna_201014:25 2 Feb '10  
GeneralRe: 还是我们中国人厉害啊 哈哈 PinmemberWillCaptain14:32 2 Feb '10  
Generallearned it!!! Pinmemberiwanna_201014:24 2 Feb '10  
Generalgreat! Pinmemberfrancis316:18 6 Oct '09  
GeneralGerat Article, Well Done Pinmemberseanco5:05 6 Oct '07  
GeneralBasic version [modified] Pinmembercharlievs18:41 9 Dec '06  
GeneralRe: Basic version PinmemberCaptainZhang2:29 10 Dec '06  
GeneralRe: Basic version PinmemberNianTzerLow6:48 14 Jan '07  
GeneralCan't you just set the form's opacity level less than 100%... PinmemberJun Du10:47 7 Nov '06  
GeneralRe: Can't you just set the form's opacity level less than 100%... PinmemberCaptainZhang2:28 10 Dec '06  
GeneralRe: Can't you just set the form's opacity level less than 100%... PinmemberNianTzerLow6:42 14 Jan '07  
GeneralResize Pinmembershubudubi4:25 1 Sep '06  
GeneralImpossible to read PinmemberDABBee12:13 29 Aug '06  
GeneralRe: Impossible to read PinmemberCaptainZhang23:15 30 Aug '06  

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

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120517.1 | Last Updated 27 Aug 2006
Article Copyright 2006 by WillCaptain
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid