ULightControl指示灯/启停控件
指示灯控件一一派生 于Control,自定义控件
用作状态显示,如设备的运行状态,启停按钮的状态,也可用作按钮
创建过程:
1.设置控件样式:
2.属性扩展: CenterColor 中心颜色BorderColor 边框颜色
LightFocusColor状态为On时灯的颜色
LightNormalColor状态为Off时灯的颜色
StateText灯状态文本
VarName 状态参数名
IsOn灯状态
3.扩展事件: ClickEvent 单击时触发
4.绘制外观:边框灯文本
public partial class ULightControl : Control
{
public ULightControl()
{
InitializeComponent();
SetStyle(ControlStyles.Selectable,true);//控件可以接受焦点
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
lightText = stateText;
}
public event EventHandler ClickEvent;//单击事件
private Color m_centerColor = Color.White;
private Color m_surroundColor = Color.Green;
public Color CenterColor
{
get => m_centerColor;
set
{
m_centerColor = value;
Refresh();
}
}
private Color m_borderColor = Color.Gray;
//边框颜色
public Color BorderColor
{
get => m_borderColor;
set
{
m_borderColor = value;
Refresh();
}
}
private Color m_focusColor = Color.Green;
// 运行时灯的颜色
public Color LightFocusColor
{
get => m_focusColor;
set
{
m_focusColor = value;
Refresh();
}
}
private Color m_normalColor = Color.Red;
// 停止时灯的颜色
public Color LightNormalColor
{
get => m_normalColor;
set
{
m_normalColor = value;
m_surroundColor = m_normalColor;
Refresh();
}
}
private string stateText = "运行";
// 指示灯状态文本
public string StateText
{
get { return stateText; }
set
{
stateText = value;
lightText = stateText;
Refresh();
}
}
private string focusstateText = "已运行";
// 指示灯状态
public string FocusStateText
{
get { return focusstateText; }
set
{
focusstateText = value;
Refresh();
}
}
private string varName;
// 状态参数名称
public string VarName
{
get { return varName; }
set { varName = value; }
}
private bool isOn=false;
// 指示灯的状态
public bool IsOn
{
get { return isOn; }
set { isOn = value;
if(isOn)//如果状态是运行时
{
m_surroundColor = LightFocusColor;//显示运行时颜色
}
else//如果是停止状态
{
m_surroundColor = LightNormalColor;//显示默认颜色
}
Refresh();
}
}
private void ULightControl_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
//重绘时 画出中心放射颜色的圆形
var path = new GraphicsPath();
//灯的矩形
Rectangle rectEllipse;
//边框矩形
Rectangle borderEllipse;
//如果有文本
if(!string.IsNullOrEmpty(lightText))
{
//定义外边框圆的矩形
borderEllipse = new Rectangle(this.Width / 4, this.Height / 8, this.Width / 2, this.Height / 2);
//定义指示灯圆的矩形
rectEllipse = new Rectangle(this.Width / 4+ 4, this.Height / 8+ 4, this.Width / 2- 8, this.Height / 2 - 8);
}
else //没有设置文本时
{
//定义外边框圆的矩形
borderEllipse = new Rectangle(5, 5, this.Width -10, this.Height -10);
//定义指示灯圆的矩形
rectEllipse = new Rectangle(4+this.Width/10, 4+this.Height/10, this.Width - 8- this.Width / 5, this.Height - 8- this.Height / 5);
}
path.AddEllipse(rectEllipse);//将表示指示灯的圆添加到路径
//创建一个填充路径的渐变画刷----径向渐变
var pthGrBrush = new PathGradientBrush(path)
{
CenterColor = CenterColor //中心颜色
};
Color[] colors = { this.m_surroundColor };
pthGrBrush.SurroundColors = colors;//关联点的颜色
g.FillEllipse(new SolidBrush(BorderColor), borderEllipse);//填充外边框圆
g.FillEllipse(pthGrBrush, rectEllipse);//填充指示灯部分
//绘制文本
if (!string.IsNullOrEmpty(lightText))
{
//定义绘制文本所在位置的矩形
Rectangle rect = new Rectangle(this.Width / 2 - this.Width / 3, (this.Height - this.Height / 3), this.Width - this.Width / 3, this.Height / 3);
//定义格式化对象
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;//水平对齐
format.LineAlignment = StringAlignment.Center;//垂直对齐
//绘制文本
g.DrawString(lightText, this.Font, new SolidBrush(this.ForeColor), rect, format);
}
}
private string lightText;
//如果有注册ClickEvent 调用事件处理程序
protected override void OnClick(EventArgs e)
{
if(ClickEvent!=null)
{
ClickEvent.Invoke(this, new EventArgs());
}
}
}