144 lines
4.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|