2023-03-31 20:31:16 +08:00

116 lines
3.8 KiB
C#

using System.Drawing.Drawing2D;
namespace Milimoe.FunGame.Desktop.Library.Component
{
partial class TransparentRect : GroupBox
{
public enum ShapeBorderStyles
{
ShapeBSNone,
ShapeBSFixedSingle,
};
private ShapeBorderStyles _borderStyle = ShapeBorderStyles.ShapeBSNone;
private Color _backColor = Color.Black;
private Color _borderColor = Color.White;
private int _radius = 20;
private int _opacity = 125;
protected int pointX = 0;
protected int pointY = 0;
protected Rectangle iRect = new Rectangle();
public TransparentRect()
{
base.BackColor = Color.Transparent;
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, false);
UpdateStyles();
}
public new Color BackColor
{
get { return _backColor; }
set { _backColor = value; Invalidate(); }
}
public ShapeBorderStyles ShapeBorderStyle
{
get { return _borderStyle; }
set { _borderStyle = value; this.Invalidate(); }
}
public Color BorderColor
{
get { return _borderColor; }
set { _borderColor = value; Invalidate(); }
}
public int Opacity
{
get { return _opacity; }
set { _opacity = value; this.Invalidate(); }
}
public int Radius
{
get { return _radius; }
set { _radius = value; this.Invalidate(); }
}
public override Color ForeColor
{
get { return base.ForeColor; }
set { base.ForeColor = value; this.Invalidate(); }
}
protected override void OnPaint(PaintEventArgs e)
{
SmoothingMode sm = e.Graphics.SmoothingMode;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
if (_borderStyle == ShapeBorderStyles.ShapeBSFixedSingle) DrawBorder(e.Graphics);
DrawLabelBackground(e.Graphics);
e.Graphics.SmoothingMode = sm;
}
private void DrawBorder(Graphics g)
{
Rectangle rect = this.ClientRectangle;
rect.Width--;
rect.Height--;
using (GraphicsPath bp = GetPath(rect, _radius))
{
using (Pen p = new Pen(_borderColor))
{
g.DrawPath(p, bp);
}
}
}
private void DrawLabelBackground(Graphics g)
{
Rectangle rect = this.ClientRectangle;
iRect = rect;
rect.X++;
rect.Y++;
rect.Width -= 2;
rect.Height -= 2;
using (GraphicsPath bb = GetPath(rect, _radius))
{
using (Brush br = new SolidBrush(Color.FromArgb(_opacity, _backColor)))
{
g.FillPath(br, bb);
}
}
}
protected GraphicsPath GetPath(Rectangle rc, int r)
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
r = r << 1;
GraphicsPath path = new GraphicsPath();
if (r > 0)
{
if (r > h) { r = h; };
if (r > w) { r = w; };
path.AddArc(x, y, r, r, 180, 90);
path.AddArc(x + w - r, y, r, r, 270, 90);
path.AddArc(x + w - r, y + h - r, r, r, 0, 90);
path.AddArc(x, y + h - r, r, r, 90, 90);
path.CloseFigure();
}
else
{
path.AddRectangle(rc);
}
return path;
}
}
}