|
// 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;
namespace System.Windows.Forms;
internal partial class PropertyGridToolStripButton : ToolStripButton
{
private readonly PropertyGrid _owningPropertyGrid;
private readonly bool _selectItemEnabled;
internal PropertyGridToolStripButton(PropertyGrid propertyGrid, bool selectItemEnabled)
: base()
{
_owningPropertyGrid = propertyGrid;
_selectItemEnabled = selectItemEnabled;
}
protected override AccessibleObject CreateAccessibilityInstance()
=> new PropertyGridToolStripButtonAccessibleObject(this);
private void DrawDashedBorer(Graphics graphics)
{
var bounds = ClientBounds;
// This is necessary so that when HighContrast is off, the size of the dotted borders coincides with the
// size of the button background. For normal mode we use the "ToolStripSystemRenderer.RenderItemInternal"
// method which calls the "VisualStyleRenderer.DrawBackground" method for drawing. For high contrast mode
// we use the "ToolStripHighContrastRenderer.OnRenderButtonBackground" method which calls the
// "Graphics.DrawRectangle" method for drawing.
bounds.Height -= 1;
// We support only one type of settings for all borders since it is consistent with the behavior of the same controls
ControlPaint.DrawBorder(graphics, bounds,
leftColor: Color.Black, leftWidth: 1, leftStyle: ButtonBorderStyle.Dashed,
topColor: Color.Black, topWidth: 1, topStyle: ButtonBorderStyle.Dashed,
rightColor: Color.Black, rightWidth: 1, rightStyle: ButtonBorderStyle.Dashed,
bottomColor: Color.Black, bottomWidth: 1, bottomStyle: ButtonBorderStyle.Dashed);
}
private void DrawHightContrastDashedBorer(Graphics graphics)
{
Rectangle bounds = ClientBounds;
float[] dashValues = [2, 2];
int penWidth = 2;
Pen focusPen1 = new(SystemColors.ControlText, penWidth)
{
DashPattern = dashValues
};
Pen focusPen2 = new(SystemColors.Control, penWidth)
{
DashPattern = dashValues,
DashOffset = 2
};
graphics.DrawRectangle(focusPen1, bounds);
graphics.DrawRectangle(focusPen2, bounds);
}
/// <summary>
/// Inheriting classes should override this method to handle this event.
/// </summary>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (!Selected)
{
return;
}
if (SystemInformation.HighContrast)
{
DrawHightContrastDashedBorer(e.Graphics);
}
else
{
DrawDashedBorer(e.Graphics);
}
}
}
|