File: System\Windows\Forms\Design\PanelDesigner.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.Versioning;
 
namespace System.Windows.Forms.Design;
 
/// <summary>
///  This class handles all design time behavior for the panel class. This
///  draws a visible border on the panel if it doesn't have a border so the
///  user knows where the boundaries of the panel lie.
/// </summary>
internal class PanelDesigner : ScrollableControlDesigner
{
    public PanelDesigner()
    {
        AutoResizeHandles = true;
    }
 
    /// <summary>
    ///  This draws a nice border around our panel. We need
    ///  this because the panel can have no border and you can't
    ///  tell where it is.
    /// </summary>
    /// <internalonly/>
    protected virtual void DrawBorder(Graphics graphics)
    {
        Panel panel = (Panel)Component; // if the panel is invisible, bail now
        if (panel is null || !panel.Visible)
        {
            return;
        }
 
        Pen pen = BorderPen;
        Rectangle rc = Control.ClientRectangle;
 
        rc.Width--;
        rc.Height--;
 
        graphics.DrawRectangle(pen, rc);
        pen.Dispose();
    }
 
    /// <summary>
    ///  Overrides our base class. Here we check to see if there
    ///  is no border on the panel. If not, we draw one so that
    ///  the panel shape is visible at design time.
    /// </summary>
    protected override void OnPaintAdornments(PaintEventArgs pe)
    {
        Panel panel = (Panel)Component;
 
        if (panel.BorderStyle == BorderStyle.None)
        {
            DrawBorder(pe.Graphics);
        }
 
        base.OnPaintAdornments(pe);
    }
 
    /// <summary>
    ///  Creates a Dashed-Pen of appropriate color.
    /// </summary>
    protected Pen BorderPen
    {
        [ResourceExposure(ResourceScope.Process)]
        [ResourceConsumption(ResourceScope.Process)]
        get
        {
            Color penColor = Control.BackColor.GetBrightness() < .5 ?
                          ControlPaint.Light(Control.BackColor) :
                          ControlPaint.Dark(Control.BackColor);
 
            Pen pen = new(penColor)
            {
                DashStyle = DashStyle.Dash
            };
 
            return pen;
        }
    }
}