添加项目文件。
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user