using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace Controls { [ToolboxItem(true)] [Description("一个用于显示通信状态的LED指示器控件")] public partial class UCLed : UserControl { private Color _onColor = Color.Green; private Color _offColor = Color.Red; private Color _blinkColor = Color.Yellow; private Color _textColor = Color.White; private string _statusText = "NG"; private bool _isOn = false; private bool _isBlinking = false; private bool _blinkState = false; private int _blinkInterval = 500; // 默认闪烁间隔(毫秒) private Timer _blinkTimer; private int _cornerRadius = 10; // 新增:控制圆角半径的字段 public UCLed() { InitializeComponent(); SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); this.BackColor = Color.Transparent; } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); InitializeTimer(); } private void InitializeTimer() { if (_blinkTimer == null) { _blinkTimer = new Timer(); _blinkTimer.Tick += BlinkTimer_Tick; _blinkTimer.Interval = _blinkInterval; } } [Category("外观")] [DefaultValue(typeof(Color), "Green")] public Color OnColor { get => _onColor; set { if (_onColor != value) { _onColor = value; Invalidate(); } } } [Category("外观")] [DefaultValue(typeof(Color), "Red")] public Color OffColor { get => _offColor; set { if (_offColor != value) { _offColor = value; Invalidate(); } } } [Category("外观")] [DefaultValue(typeof(Color), "Yellow")] public Color BlinkColor { get => _blinkColor; set { if (_blinkColor != value) { _blinkColor = value; Invalidate(); } } } [Category("外观")] [DefaultValue(typeof(Color), "White")] public Color TextColor { get => _textColor; set { if (_textColor != value) { _textColor = value; Invalidate(); } } } [Category("外观")] [DefaultValue(10)] public int CornerRadius { get => _cornerRadius; set { if (_cornerRadius != value) { _cornerRadius = value; Invalidate(); } } } [Category("外观")] [DefaultValue("NG")] public string StatusText { get => _statusText; set { if (_statusText != value) { _statusText = value; Invalidate(); } } } [Category("行为")] [DefaultValue(false)] public bool IsOn { get => _isOn; set { if (_isOn != value) { _isOn = value; if (!_isBlinking) { Invalidate(); } } } } [Category("行为")] [DefaultValue(false)] public bool IsBlinking { get => _isBlinking; set { if (_isBlinking != value) { _isBlinking = value; if (_isBlinking) _blinkTimer?.Start(); else { _blinkTimer?.Stop(); _blinkState = false; } Invalidate(); } } } [Category("行为")] [DefaultValue(500)] public int BlinkInterval { get => _blinkInterval; set { if (_blinkInterval != value) { _blinkInterval = value; if (_blinkTimer != null && !DesignMode) { _blinkTimer.Interval = _blinkInterval; } } } } private void BlinkTimer_Tick(object sender, EventArgs e) { _blinkState = !_blinkState; this.BeginInvoke(new Action(() => this.Invalidate())); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; Color currentColor; if (_isBlinking) { currentColor = _blinkState ? _blinkColor : (_isOn ? _onColor : _offColor); } else { currentColor = _isOn ? _onColor : _offColor; } using (GraphicsPath path = CreateRoundedRectangle(ClientRectangle, _cornerRadius)) using (SolidBrush backBrush = new SolidBrush(currentColor)) { g.FillPath(backBrush, path); } using (Brush textBrush = new SolidBrush(_textColor)) { StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; g.DrawString(_statusText, Font, textBrush, ClientRectangle, sf); } } private GraphicsPath CreateRoundedRectangle(Rectangle bounds, int radius) { int diameter = radius * 2; Size size = new Size(diameter, diameter); Rectangle arc = new Rectangle(bounds.Location, size); GraphicsPath path = new GraphicsPath(); if (radius == 0) { path.AddRectangle(bounds); return path; } // 左上角 path.AddArc(arc, 180, 90); // 右上角 arc.X = bounds.Right - diameter; path.AddArc(arc, 270, 90); // 右下角 arc.Y = bounds.Bottom - diameter; path.AddArc(arc, 0, 90); // 左下角 arc.X = bounds.Left; path.AddArc(arc, 90, 90); path.CloseFigure(); return path; } } }