实现一个开关阀控件,使用自定义控件,显示效果如下所示:
其中,上方为线圈状态,下方为阀体状态,如下所示:
当线圈给电时,线圈为绿色;当线圈失电时,线圈为红色;代码中用value1控制
当阀门开到位时,阀体状态显示为绿色;当阀门关到位时,阀体状态显示为红色;代码中用value2控制
代码如下:
using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace 各种C_sharp功能测试 { public partial class ShutOffValve : Control { public ShutOffValve() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); } //变量值为true时显示的颜色 private Color trueColor = Color.Green; public Color TrueColor { get { return trueColor; } set { trueColor = value; Invalidate(); } } //变量值为false时显示的颜色 private Color falseColor = Color.Red; public Color FalseColor { get { return falseColor; } set { falseColor = value; Invalidate(); } } //线圈状态,显示线圈是否送电,线圈给电为true,线圈失电为false private bool value1 = false; public bool Value1 { get { return value1; } set { value1 = value; Invalidate(); } } //阀体状态,根据阀体机械反馈显示阀体状态,开到位为true,关到位为false private bool value2 = false; public bool Value2 { get { return value2; } set { value2 = value; Invalidate(); } } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); //获取绘图对象 Graphics g = pe.Graphics; //呈现质量设置为高质量 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//HighQuality和AntiAlias执行效果相同 //第一步绘制上方矩形 GraphicsPath path1 = new GraphicsPath(); path1.AddRectangle(new Rectangle(Width / 4, 0, Width / 2, Height / 3)); path1.CloseFigure(); g.FillPath(new SolidBrush(value1 ? trueColor : FalseColor), path1); //第二步绘制中间竖线 g.DrawLine(new Pen(Color.Black, 2f), new Point(Width / 2, Height / 3), new Point(Width / 2, Height * 2 / 3)); //第三步绘制下方8字三角形 GraphicsPath path3 = new GraphicsPath(); Point p1 = new Point(0, Height / 3); Point p2 = new Point(Width - 1, Height / 3); Point p3 = new Point(Width - 1, Height - 1); Point p4 = new Point(0, Height - 1); path3.AddLine(p1, p3); path3.AddLine(p3, p2); path3.AddLine(p2, p4); path3.AddLine(p4, p1); path3.CloseFigure(); g.FillPath(new SolidBrush(value2 ? trueColor : FalseColor), path3); } } }
使用方法:
双击阀门图标,切换阀门状态,通过线圈状态去控制右边LED的状态,如下所示:
窗体中的代码如下:
private void shutOffValve1_Click(object sender, EventArgs e) { string msg = this.shutOffValve1.Value1 ? "关闭阀门?" : "打开阀门?"; DialogResult r = MessageBox.Show(msg, "阀门操作提示", MessageBoxButtons.OKCancel); if (r == DialogResult.OK) { this.shutOffValve1.Value1 = !this.shutOffValve1.Value1; Invalidate(); } if (this.shutOffValve1.Value1 == true) { led.CentorColor = Color.Green; } else { led.CentorColor= Color.Red; } }
显示效果如下:
有些开关阀没有状态反馈触电可以在PLC中做软触电反馈,也可以在上位机中修改,如下所示:
private void shutOffValve1_Click(object sender, EventArgs e) { string msg = this.shutOffValve1.Value1 ? "关闭阀门?" : "打开阀门?"; DialogResult r = MessageBox.Show(msg, "阀门操作提示", MessageBoxButtons.OKCancel); if (r == DialogResult.OK) { this.shutOffValve1.Value1 = !this.shutOffValve1.Value1; this.shutOffValve1.Value2 = this.shutOffValve1.Value1; Invalidate(); } if (this.shutOffValve1.Value1 == true) { led.CentorColor = Color.Green; } else { led.CentorColor= Color.Red; } }
显示效果如下:
标签:控件,shut,shutOffValve1,off,Point,Color,Value1,new,true From: https://www.cnblogs.com/hanzq/p/17496381.html