添加项目文件。
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
using JinYuan.Models;
|
||||
using SeeSharpTools.JY.GUI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace JinYuan.ControlLib
|
||||
{
|
||||
public enum BatteryStatus
|
||||
{
|
||||
Init, // 初始化-浅灰
|
||||
PackNG, // 装箱NG-红色
|
||||
Replacing, // 替换中-天蓝色
|
||||
Normal // 正常-绿色
|
||||
}
|
||||
|
||||
public class BatteryControl : LED
|
||||
{
|
||||
// 位置信息
|
||||
public string Grade { get; set; } // 等级(对应Tab页)
|
||||
public int Layer { get; set; } // 层
|
||||
public int Row { get; set; } // 行
|
||||
public int Col { get; set; } // 列
|
||||
public string Container { get; set; }// 容器编号
|
||||
public string Barcode { get; set; } // 电池条码
|
||||
public BatteryStatus Status { get; set; } = BatteryStatus.Init;
|
||||
|
||||
private readonly Size _squareSize = new Size(25, 25);
|
||||
public Size BatterySquareSize => _squareSize;
|
||||
|
||||
public BatteryControl(BatteryStatus status)
|
||||
: this("", 0, 0, 0, "")
|
||||
{
|
||||
UpdateStatus(status);
|
||||
}
|
||||
|
||||
// 构造函数:初始化工业风样式
|
||||
public BatteryControl(string grade, int layer, int row, int col, string container, BatteryStatus status = BatteryStatus.Init)
|
||||
{
|
||||
// 基础位置信息
|
||||
this.Grade = grade;
|
||||
this.Layer = layer;
|
||||
this.Row = row;
|
||||
this.Col = col;
|
||||
this.Container = container;
|
||||
|
||||
// 核心样式配置
|
||||
this.Size = _squareSize;
|
||||
this.MinimumSize = _squareSize;
|
||||
this.MaximumSize = _squareSize;
|
||||
this.BorderStyle = BorderStyle.None;
|
||||
this.BackColor = Color.FromArgb(24, 24, 24);
|
||||
this.Margin = new Padding(2);
|
||||
|
||||
// LED控件核心配置
|
||||
this.Style = LedStyle.Circular;
|
||||
this.Interacton = InteractionStyle.Indicator;
|
||||
this.BlinkOn = false;
|
||||
this.BlinkInterval = 500;
|
||||
|
||||
// 初始化LED基础颜色
|
||||
this.OffColor = Color.Gray; // 默认关闭颜色(Init状态)
|
||||
this.OnColor = Color.LimeGreen;// 默认开启颜色(Normal状态)
|
||||
this.Value = false; // 默认关闭(Init状态)
|
||||
|
||||
// 双缓冲优化,防止闪烁
|
||||
this.DoubleBuffered = true;
|
||||
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
|
||||
ControlStyles.AllPaintingInWmPaint |
|
||||
ControlStyles.UserPaint, true);
|
||||
ResizeRedraw = false; // 禁止调整大小重绘
|
||||
|
||||
// 默认状态
|
||||
UpdateStatus(status);
|
||||
|
||||
// 点击事件
|
||||
Click += (s, e) => OnBatteryClicked?.Invoke(this);
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
// 强制保持正方形
|
||||
if (this.Size != _squareSize)
|
||||
{
|
||||
this.Size = _squareSize;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新状态方法,确保颜色立即生效
|
||||
public void UpdateStatus(BatteryStatus status)
|
||||
{
|
||||
// 防止跨线程调用问题
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
this.Invoke(new Action<BatteryStatus>(UpdateStatus), status);
|
||||
return;
|
||||
}
|
||||
|
||||
this.Status = status;
|
||||
switch (status)
|
||||
{
|
||||
case BatteryStatus.Normal:
|
||||
this.Value = true; // 必须设为true才能显示OnColor
|
||||
this.OnColor = Color.LimeGreen;
|
||||
this.OffColor = Color.Transparent;
|
||||
break;
|
||||
case BatteryStatus.PackNG:
|
||||
this.Value = true; // 必须设为true才能显示OnColor
|
||||
this.OnColor = Color.Red;
|
||||
this.OffColor = Color.Transparent;
|
||||
break;
|
||||
case BatteryStatus.Init:
|
||||
this.Value = false; // 设为false显示OffColor
|
||||
this.OffColor = Color.Gray;
|
||||
this.OnColor = Color.Transparent;
|
||||
this.Barcode = null;
|
||||
break;
|
||||
case BatteryStatus.Replacing:
|
||||
this.Value = true; // 必须设为true才能显示OnColor
|
||||
this.OnColor = Color.SkyBlue;
|
||||
this.OffColor = Color.Transparent;
|
||||
break;
|
||||
}
|
||||
|
||||
// 强制刷新控件,确保颜色立即更新
|
||||
this.Invalidate();
|
||||
//this.Update();
|
||||
//this.Refresh();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 绑定数据(线程安全+状态更新)
|
||||
/// </summary>
|
||||
public void BindData(string barcode, BatteryStatus status, string container = null)
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
BeginInvoke(new Action<string, BatteryStatus, string>(BindData), barcode, status, container);
|
||||
return;
|
||||
}
|
||||
|
||||
Barcode = barcode;
|
||||
if (!string.IsNullOrEmpty(container))
|
||||
{
|
||||
Container = container;
|
||||
}
|
||||
|
||||
// 仅状态变化时更新
|
||||
if (Status != status)
|
||||
{
|
||||
UpdateStatus(status);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清理控件(重置为初始状态)
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
BindData(null, BatteryStatus.Init, Container);
|
||||
}
|
||||
|
||||
// 选中事件回调
|
||||
public event Action<BatteryControl> OnBatteryClicked;
|
||||
|
||||
// 重写OnPaint方法,确保绘制生效
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
// 启用双缓冲和高质量绘制
|
||||
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
|
||||
base.OnPaint(e);
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// BatteryControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
|
||||
this.Name = "BatteryControl";
|
||||
this.Size = new System.Drawing.Size(40, 40);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user