Files
2026-09-09 18:42:38 +08:00

144 lines
4.3 KiB
C#

using AntdUI.Theme;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AntdUI;
namespace JinYuan.ControlLib
{
public partial class CustomGroupBox : GroupBox
{
private Color darkBorderColor = Color.FromArgb(64, 64, 64);
private Color lightBorderColor = Color.FromArgb(217, 217, 217);
private Color darkForeColor = Color.White;
private Color lightForeColor = Color.Black;
private const int TextPadding = 4;
public Color BorderColor { get; set; } = Color.Gray;
private float _borderWidth = 1f;
private float _cornerRadius = 5f;
[Category("Appearance")]
[DefaultValue(1f)]
public float BorderWidth
{
get => _borderWidth;
set
{
_borderWidth = value;
Invalidate();
}
}
[Category("Appearance")]
[DefaultValue(5f)]
public float CornerRadius
{
get => _cornerRadius;
set
{
_cornerRadius = value;
Invalidate();
}
}
public CustomGroupBox()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
UpdateTheme(Config.IsDark);
}
public void UpdateTheme(bool isDark)
{
ForeColor = isDark ? darkForeColor : lightForeColor;
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
var borderColor = Config.IsDark ? darkBorderColor : lightBorderColor;
var textSize = g.MeasureString(Text, Font);
var textWidth = (int)Math.Ceiling(textSize.Width) + TextPadding * 2;
var textHeight = (int)Math.Ceiling(textSize.Height);
var textRect = new Rectangle(TextPadding, 0, textWidth, textHeight);
var borderRect = new Rectangle((int)(_borderWidth / 2), textHeight / 2,
Width - 1 - (int)_borderWidth, Height - textHeight / 2 - 1 - (int)_borderWidth);
//绘制边框颜色
using (var pen = new Pen(BorderColor, BorderWidth))
{
e.Graphics.DrawRectangle(pen, 0, 0, Width - BorderWidth, Height - BorderWidth);
}
// 绘制背景
using (var brush = new SolidBrush(BackColor))
{
g.FillRectangle(brush, ClientRectangle);
}
// 创建圆角矩形路径
using (var path = GetRoundedRectanglePath(borderRect, _cornerRadius))
{
// 绘制边框
using (var pen = new Pen(borderColor, _borderWidth))
{
g.DrawPath(pen, path);
}
}
// 绘制标题文本背景
using (var brush = new SolidBrush(BackColor))
{
g.FillRectangle(brush, textRect);
}
// 绘制标题文本
using (var brush = new SolidBrush(ForeColor))
{
g.DrawString(Text, Font, brush, textRect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
}
}
private GraphicsPath GetRoundedRectanglePath(Rectangle rect, float radius)
{
GraphicsPath path = new GraphicsPath();
float diameter = radius * 2;
RectangleF arcRect = new RectangleF(rect.Location, new SizeF(diameter, diameter));
// 左上角
path.AddArc(arcRect, 180, 90);
// 顶边
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, 270, 90);
// 右边
arcRect.Y = rect.Bottom - diameter;
path.AddArc(arcRect, 0, 90);
// 底边
arcRect.X = rect.Left;
path.AddArc(arcRect, 90, 90);
path.CloseFigure();
return path;
}
}
}