winform控件开发一之复合控件开发(2)开关阀(shut-off valve)

发布时间 2023-06-21 15:41:52作者: hanzq_go

实现一个开关阀控件,使用自定义控件,显示效果如下所示:

其中,上方为线圈状态,下方为阀体状态,如下所示:

 当线圈给电时,线圈为绿色;当线圈失电时,线圈为红色;代码中用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;
     }
 }

 

显示效果如下: