首页 > 其他分享 >winform控件开发一之复合控件开发(2)开关阀(shut-off valve)

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

时间:2023-06-21 15:44:07浏览次数:36  
标签:控件 shut shutOffValve1 off Point Color Value1 new true

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

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

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

相关文章

  • winform控件开发一之复合控件开发(1)模拟量显示1
    winform控件开发包括三种类型复合控件,又称为组合控件扩展控件自定义控件复合控件:复合控件,又称为组合控件,一般是将现有控件功能进行组合形成一个新的控件。举例:设计一个工控中常用的模拟量控件,可以显示变量的名称,变量值和单位,如下图所示 在这个复合空间中,左边使用一个l......
  • 一起被裁,朋友背着我拿了5个大厂offer,我坐不住了……
    前言同样在去年年底被裁,为什么我的一个朋友拿到华为、阿里巴巴、字节跳动、拼多多、百度等5家大厂的offer,而我连一个面试的机会都没有。在这之后我又尝试投了不下于十几次的简历,结果都是了无音讯。我实在是坐不住了,就去咨询了下我这个朋友,他说除了硬实力,软技巧也同样重要。下面就是......
  • ui设计师界面combobox控件添加鼠标点击信号
    一、概述combobox下拉框控件下拉后会显示预设好的选择内容,可是想要实现显示内容动态可变,点击的时候实时刷新到最新内容,就需要点击信号,但是qt本身没有实现这个点击信号。要实现这个功能本质方法是需要重写combobox的鼠标点击事件,这里介绍如何为ui设计师界面的combobox控件添加......
  • Qt编写控件组态属性设计器源码属性设计器产品不包括里面控件的源码
    Qt编写控件组态属性设计器源码属性设计器产品不包括里面控件的源码1.自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。2.拖曳到画布自动生成对应的控件,所见即所得。3.右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小白使用。4.独创属性......
  • 菜单的程序控件出现和消失
    @OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);ButtonmenuButton=(Button)findViewById(R.id.menuButton);menuButton.setOnClickListener(newView.OnClickListener(){......
  • 【剑指 Offer】数组中重复的数字(C++_Easy_遍历/哈希/快排/原地)
    题目在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。测试样例输入:[2,3,1,0,2,5,3]输出:2或3限制2<=n<=100000题解题解一:遍历对vector容器......
  • 【剑指 Offer】用两个栈实现队列(C++_Easy_栈/队列)
    1.题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回-1)2.示例2.1示例1输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”......
  • DevExpress WPF功能区控件,更轻松创建商业应用工具栏!(下)
    在上文中(点击这里回顾>>),我们主要介绍了DevExpressWPF的Ribbon、Toolbar和Menus组件支持MVVM、功能区命令栏和视图等,本文将继续介绍这些组件的自定义功能等。DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建......
  • Android大厂面试题以及答案整理(2022年2月份更新),助你轻松拿下高薪offer
    前言想必现在有许多朋友,都在为即将到来的金三银四做准备,不知道各位朋友是否十足的把握能拿到自己心仪的Offer呢?下面无偿分享一份包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目,熟悉本文中列出的知识点会大大增加通过前两轮......
  • Android面试官问的一些问题,看完这一篇就没有拿不到的offer
    背景我是2020年毕业于中南大学的计算机学院的,我毕业之后在华为工作了差不多两年多,一直都从事着Android开发。然后去年年底的时候因为我自己的一些原因打算离职到外面看看,那个时候我是投了超级多简历,然后去面试了小红书啊、快手啊,爱奇艺啊,微信,小米…等等很多的大厂,小厂,然后下面这......