C# Bevel control

The .NET WinForms controls are missing anything quite like Delphi's bevel control. The Panel control with a border looks too deep. Not a deal breaker, and certainly not reason enough to go back to Delphi but anyway, here's a control that looks pretty much like it.

using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace FreeFlow.WinFormsControls
{
  /// <summary>Bevel border style.</summary>
  public enum BevelStyle
  {
    /// <summary>Lowered border.</summary>
    Lowered,
    /// <summary>Raised border.</summary>
    Raised,
    /// <summary>No border.</summary>
    Flat
  }

  /// <summary>
  /// A bevel control.
  /// </summary>
  public class Bevel : System.Windows.Forms.Control
  {
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    private const Border3DSide DefaultShape = Border3DSide.Bottom;
    private const BevelStyle DefaultStyle = BevelStyle.Lowered;

    /// <summary>
    /// Initializes a new instance of the <see cref="Bevel"/> class.
    /// </summary>
    public Bevel()
    {
      // This call is required by the Windows.Forms Form Designer.
      InitializeComponent();

      this.SetStyle(ControlStyles.ResizeRedraw, true);
      this.SetStyle(ControlStyles.DoubleBuffer, true);

      style = DefaultStyle;
      shape = DefaultShape;
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if( components != null )
          components.Dispose();
      }
      base.Dispose( disposing );
    }

    #region Component Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      components = new System.ComponentModel.Container();
    }
    #endregion

    /// <summary>Paints the rule.</summary>
    protected override void OnPaint(PaintEventArgs e)
    {
      // Create a local version of the graphics object for the Bevel.
      Graphics g = e.Graphics;
      Rectangle r = ClientRectangle;

      if (Style != BevelStyle.Flat)
      {
        Border3DStyle style = Border3DStyle.SunkenOuter;
        if (Style == BevelStyle.Raised)
          style = Border3DStyle.RaisedInner;

        // Draw the Bevel.
        switch (Shape)
        {
          case Border3DSide.All:
            ControlPaint.DrawBorder3D(g, r.Left, r.Top, r.Width, r.Height, style);
            break;
          case Border3DSide.Left:
            ControlPaint.DrawBorder3D(g, r.Left, r.Top, 2, r.Height, style);
            break;
          case Border3DSide.Top:
            ControlPaint.DrawBorder3D(g, r.Left, r.Top, r.Width, 2, style);
            break;
          case Border3DSide.Bottom:
            ControlPaint.DrawBorder3D(g, r.Left, r.Bottom-2, r.Width, 2, style);
            break;
          case Border3DSide.Middle:
            break;
          case Border3DSide.Right:
            ControlPaint.DrawBorder3D(g, r.Right-2, r.Top, 2, r.Height, style);
            break;
          default:
            Debug.Assert(false);
            break;
        }
      }

      // Calling the base class OnPaint
      base.OnPaint(e);
    }

    private Border3DSide shape;
    /// <summary>
    /// Gets or sets the shape of the bevel.
    /// </summary>
    [DefaultValue(DefaultShape)]
    public Border3DSide Shape
    {
      get
      {
        return shape;
      }
      set
      {
        shape = value;
        Invalidate();
      }
    }

    private BevelStyle style;
    /// <summary>
    /// Gets or sets the style of the bevel.
    /// </summary>
    [DefaultValue(DefaultStyle)]
    public BevelStyle Style
    {
      get
      {
        return style;
      }
      set
      {
        style = value;
        Invalidate();
      }
    }
  }
}