|
// 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;
public class ToolStripRenderEventArgs : EventArgs
{
private Color _backColor;
/// <summary>
/// This class represents all the information to render the toolStrip
/// </summary>
public ToolStripRenderEventArgs(Graphics g, ToolStrip toolStrip)
: this(g, toolStrip, new Rectangle(Point.Empty, toolStrip.OrThrowIfNull().Size), Color.Empty)
{
}
/// <summary>
/// This class represents all the information to render the toolStrip
/// </summary>
public ToolStripRenderEventArgs(
Graphics g,
ToolStrip toolStrip,
Rectangle affectedBounds,
Color backColor)
{
Graphics = g.OrThrowIfNull();
ToolStrip = toolStrip.OrThrowIfNull();
AffectedBounds = affectedBounds;
_backColor = backColor;
}
/// <summary>
/// The graphics object to draw with
/// </summary>
public Graphics Graphics { get; }
/// <summary>
/// The bounds to draw in
/// </summary>
public Rectangle AffectedBounds { get; }
/// <summary>
/// Represents which toolStrip was affected by the click
/// </summary>
public ToolStrip ToolStrip { get; }
/// <summary>
/// The back color to draw with.
/// </summary>
public Color BackColor
{
get
{
if (_backColor != Color.Empty)
{
return _backColor;
}
// get the user specified color
if (ToolStrip is null)
{
_backColor = SystemColors.Control;
return _backColor;
}
_backColor = ToolStrip.RawBackColor;
if (_backColor != Color.Empty)
{
return _backColor;
}
if (ToolStrip is ToolStripDropDown)
{
_backColor = SystemColors.Menu;
}
else if (ToolStrip is MenuStrip)
{
_backColor = SystemColors.MenuBar;
}
else
{
_backColor = SystemColors.Control;
}
return _backColor;
}
}
public Rectangle ConnectedArea
{
get
{
if (ToolStrip is ToolStripDropDown dropDown)
{
ToolStripDropDownItem? ownerItem = dropDown.OwnerItem as ToolStripDropDownItem;
if (ownerItem is MdiControlStrip.SystemMenuItem)
{
// there's no connected rect between a system menu item and a dropdown.
return Rectangle.Empty;
}
if (ownerItem is not null && ownerItem.ParentInternal is not null && !ownerItem.IsOnDropDown)
{
// translate the item into our coordinate system.
Rectangle itemBounds = new(ToolStrip.PointToClient(ownerItem.TranslatePoint(Point.Empty, ToolStripPointType.ToolStripItemCoords, ToolStripPointType.ScreenCoords)), ownerItem.Size);
Rectangle overlap = ToolStrip.ClientRectangle;
overlap.Inflate(1, 1);
if (overlap.IntersectsWith(itemBounds))
{
switch (ownerItem.DropDownDirection)
{
case ToolStripDropDownDirection.AboveLeft:
case ToolStripDropDownDirection.AboveRight:
return Rectangle.Empty;
case ToolStripDropDownDirection.BelowRight:
case ToolStripDropDownDirection.BelowLeft:
overlap.Intersect(itemBounds);
if (overlap.Height == 2)
{
return new Rectangle(itemBounds.X + 1, 0, itemBounds.Width - 2, 2);
}
// If its overlapping more than one pixel, this means we've pushed it to obscure
// the menu item. In this case pretend it's not connected.
return Rectangle.Empty;
case ToolStripDropDownDirection.Right:
case ToolStripDropDownDirection.Left:
return Rectangle.Empty;
}
}
}
}
return Rectangle.Empty;
}
}
}
|