初始化提交
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user