Open WinForms - Open Source Windows Forms and Controls

{} DailyCoding.com - Tips and tricks - C#, ASP.NET
 Subscribe in a reader

 
Home    Controls    Articles    Contact
  Creating cool gradient Panel in Winform - .NET (Using GDI+)
Download Source Code - Cool_Gradient_Panel.zip
 
 
Post comments    Need help?

Introduction

This article will explain how we can create cool looking gradient panel with round corner in .net winforms using GDI+. This panel supports various customizable properties. Below are some cool samples.

Cool Panel

Features

You can customize follwing things in this panel
  • Gradeint Start Color
  • Gradient End Color
  • Border Color
  • Border Width
  • Shadow Offset
  • Round corner radius
  • Panel Image
  • Panel Image location

Cool Panel

Source Code (Download here)

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace Owf.Controls
{
  // A1Panel class
  public partial class A1Panel : Panel
  {
    int _borderWidth = 1;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue(1)]
    public int BorderWidth
    {
      get { return _borderWidth; }
      set { _borderWidth = value; Invalidate(); }
    }

    int _shadowOffSet = 5;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue(5)]
    public int ShadowOffSet
    {
      get
      {
        return _shadowOffSet;
      }
      set { _shadowOffSet = Math.Abs(value); Invalidate(); }
    }

    int _roundCornerRadius = 4;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue(4)]
    public int RoundCornerRadius
    {
      get { return _roundCornerRadius; }
      set { _roundCornerRadius = Math.Abs(value); Invalidate(); }
    }

    Image _image;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    public Image Image
    {
      get { return _image; }
      set { _image = value; Invalidate(); }
    }

    Point _imageLocation = new Point(4, 4);
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue("4,4")]
    public Point ImageLocation
    {
      get { return _imageLocation; }
      set { _imageLocation = value; Invalidate(); }
    }

    Color _borderColor = Color.Gray;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue("Color.Gray")]
    public Color BorderColor
    {
      get { return _borderColor; }
      set { _borderColor = value; Invalidate(); }
    }

    Color _gradientStartColor = Color.White;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue("Color.White")]
    public Color GradientStartColor
    {
      get { return _gradientStartColor; }
      set { _gradientStartColor = value; Invalidate(); }
    }

    Color _gradientEndColor = Color.Gray;
    [Browsable(true), Category(A1PanelGlobals.A1Category)]
    [DefaultValue("Color.Gray")]
    public Color GradientEndColor
    {
      get { return _gradientEndColor; }
      set { _gradientEndColor = value; Invalidate(); }
    }

    public A1Panel()
    {
      this.SetStyle(ControlStyles.DoubleBuffer, true);
      this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      this.SetStyle(ControlStyles.ResizeRedraw, true);
      this.SetStyle(ControlStyles.UserPaint, true);
      this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
      InitializeComponent();
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
      base.OnPaintBackground(e);

      int tmpShadowOffSet = Math.Min(Math.Min(_shadowOffSet, this.Width - 2), this.Height - 2);
      int tmpSoundCornerRadius = Math.Min(Math.Min(_roundCornerRadius, this.Width - 2), this.Height - 2);
      if (this.Width > 1 && this.Height > 1)
      {
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

        Rectangle rect = new Rectangle(0, 0, this.Width - tmpShadowOffSet - 1,  
                           this.Height - tmpShadowOffSet - 1);
                           
        Rectangle rectShadow = new Rectangle(tmpShadowOffSet, tmpShadowOffSet, 
                           this.Width - tmpShadowOffSet - 1, this.Height - tmpShadowOffSet - 1);

        GraphicsPath graphPathShadow = A1PanelGraphics.GetRoundPath(rectShadow, tmpSoundCornerRadius);
        GraphicsPath graphPath = A1PanelGraphics.GetRoundPath(rect, tmpSoundCornerRadius);

        if (tmpSoundCornerRadius > 0)
        {
          using (PathGradientBrush gBrush = new PathGradientBrush(graphPathShadow))
          {
            gBrush.WrapMode = WrapMode.Clamp;
            ColorBlend colorBlend = new ColorBlend(3);
            colorBlend.Colors = new Color[]{Color.Transparent,
                Color.FromArgb(180, Color.DimGray),
                Color.FromArgb(180, Color.DimGray)};

            colorBlend.Positions = new float[] { 0f, .1f, 1f };

            gBrush.InterpolationColors = colorBlend;
            e.Graphics.FillPath(gBrush, graphPathShadow);
          }
        }

        // Draw backgroup
        LinearGradientBrush brush = new LinearGradientBrush(rect,
        this._gradientStartColor,
        this._gradientEndColor,
        LinearGradientMode.BackwardDiagonal);
        e.Graphics.FillPath(brush, graphPath);
        e.Graphics.DrawPath(new Pen(Color.FromArgb(180, this._borderColor), _borderWidth), graphPath);

        // Draw Image
        if (_image != null)
        {
          e.Graphics.DrawImageUnscaled(_image, _imageLocation);
        }
      }
    }
  }

  // A1PanelGraphics class
  internal class A1PanelGraphics
  {
    public static GraphicsPath GetRoundPath(Rectangle r, int depth)
    {
      GraphicsPath graphPath = new GraphicsPath();

      graphPath.AddArc(r.X, r.Y, depth, depth, 180, 90);
      graphPath.AddArc(r.X + r.Width - depth, r.Y, depth, depth, 270, 90);
      graphPath.AddArc(r.X + r.Width - depth, r.Y + r.Height - depth, depth, depth, 0, 90);
      graphPath.AddArc(r.X, r.Y + r.Height - depth, depth, depth, 90, 90);
      graphPath.AddLine(r.X, r.Y + r.Height - depth, r.X, r.Y + depth / 2);

      return graphPath;
    }
  }

  // A1PanelGlobals class
  internal class A1PanelGlobals
  {
    public const string A1Category = "A1";
  }
}
				

Some Other Cool samples


Cool Panel

Post comments    Need help?
Sponsors
 
  Tags: .NET, Panel, GDI+, Gradient, GDI+ controls

Facing issue while using? contact sa@openwinforms.com
 
 

Contact Site Admin: sa@openwinforms.com