Winform自定义控件 —— 指示灯

这篇具有很好参考价值的文章主要介绍了Winform自定义控件 —— 指示灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在开始阅读本文之前,如果您有学习创建自定义控件库并在其他项目中引用的需求,请参考:在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https://blog.csdn.net/YMGogre/article/details/126508042


目录

1、应用场景: 

1.1、本文的应用场景: 

2、所需资源: 

3、源代码: 

4、使用方法: 

5、效果演示:


1、应用场景: 

  • 当我们需要在窗口上通过一个指示灯来表示一个硬件设备或者程序的运行状态时;
  • 当我们需要一个可以显示不同颜色的指示灯来表征硬件设备或程序不同的状态时;
  • 当我们需要指示灯可以对用户的"点击"之类的交互做出响应时; 

1.1、本文的应用场景: 

        此控件设计初衷是:采用一个四色指示灯来表示某件事情的执行状态。共设置有四个状态:"waiting(等待中)"、"underway(正在进行)"、"completed(已完成)"、"pick(选中)"。分别通过四种颜色来表征:"DimGray(暗灰色)"、"Cornsilk(玉米丝色)"、"Aquamarine(碧绿色)"、"Coral(珊瑚色)"。

        此外,如果我们对某些"已完成"的事件不满意,我们可以选中那些事件对应的指示灯,以方便程序对我们选中的事件做后续操作:

        我们可以通过鼠标点击选中"已完成"状态下的指示灯,此时指示灯状态会改为"选中",当然也可以取消选中;而其他状态下的指示灯无法被选中。 

2、所需资源: 

(无) 

3、源代码: 

/* IndicatorLight.cs */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//注意命名空间修改为自己项目的命名空间
namespace WindowsFormsControlLibraryMadeByXJY
{
    public partial class IndicatorLight : UserControl
    {
        private bool _Light_clickable = true;
        private string _Light_text = "";
        private int Curr_StatusCode;        //当前状态编码
        private enum Light_States
        {
            waiting = 0,
            underway,
            completed,
            pick
        }
        private string[] Get_Status = new string[] { "waiting", "underway", "completed", "pick" };

        private Color Curr_Color;           //当前颜色
        private Color[] lightColors = new Color[] {Color.DimGray, Color.Cornsilk, Color.Aquamarine, Color.Coral};


        /// <summary>
        /// 自定义的text属性
        /// </summary>
        [Category("Text"), Description("文本框里的提示文字"), Browsable(true)]
        public string Light_text
        {
            get { return _Light_text; }
            set
            {
                if (value == null) throw new ArgumentNullException("value");

                _Light_text = value;
                this.Invalidate();
            }
        }

        /// <summary>
        /// 设置指示灯是否可以被点击,这取决于你是否想要指示灯对用户交互作出反应
        /// </summary>
        public bool Light_clickable
        {
            get { return _Light_clickable; }
            set
            {
                _Light_clickable = value;
            }
        }

        /// <summary>
        /// 设置四色灯状态,暗灰色表示"等待中";玉米丝色表示"进行中";碧绿色表示"已完成";珊瑚色表示"选中"
        /// 可以自行添加更多的case来给指示灯添加更多的颜色以及这些颜色对应的状态;
        /// 这需要你:1、在Light_States添加你想使用指示灯来表示的状态项;
        ///           2、在Get_Status中同样添加你想使用指示灯来表示的状态项;
        ///           3、在lightColors中添加你想用于表征该状态的颜色。
        /// </summary>
        /// <param name="s">状态:"waiting"表示"等待中";"underway"表示"进行中";"completed"表示"已完成";"pick"表示"选中";以上都不是则默认进入"waiting"状态</param>
        public void SetStatus(string s)
        {
            switch (s)
            {
                case "waiting":
                    Curr_StatusCode = (int)Light_States.waiting;
                    break;
                case "underway":
                    Curr_StatusCode = (int)Light_States.underway;
                    break;
                case "completed":
                    Curr_StatusCode = (int)Light_States.completed;
                    break;
                case "pick":
                    Curr_StatusCode = (int)Light_States.pick;
                    break;
                default:        //对于其他输入均默认进入"等待中"状态
                    Curr_StatusCode = (int)Light_States.waiting;
                    break;
            }
            try
            {
                Curr_Color = lightColors[Curr_StatusCode];
                this.Invalidate();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        /// <summary>
        /// 获取信号灯状态,根据当前状态返回对应的字符串(比如当前状态为"waiting",则返回"waiting")
        /// </summary>
        public string GetStatus
        {
            get { return Get_Status[Curr_StatusCode]; }
        }

        /// <summary>
        /// 重置信号灯状态为"waiting"
        /// </summary>
        public void ResetState()
        {
            this.SetStatus("waiting");
        }

        public IndicatorLight()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.Cursor = Cursors.Hand;   
            this.Size = new Size(50, 50);
            Curr_StatusCode = (int)Light_States.waiting;
            Curr_Color = lightColors[Curr_StatusCode];
        }

        /// <summary>
        /// 重绘控件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.DrawEllipse(new Pen(new SolidBrush(Color.Blue),2), new Rectangle(4, 4, this.Width - 8, this.Height - 8));
            g.FillEllipse(new SolidBrush(Curr_Color), new Rectangle(4, 4, this.Width - 8, this.Height - 8));           
            TextRenderer.DrawText(g, Light_text, this.Font, new Rectangle(4, 4, this.Width - 8, this.Height - 8), SystemColors.InfoText);
        }


        /// <summary>
        /// 处理四色灯控件的SizeChanged事件中针对只调整单边大小的情况。
        /// </summary>
        /// <param name="sender">事件的来源</param>
        /// <param name="e">The <see cref="EventArgs"/>包含事件数据的实例</param>
        void UCSignalLamp_SizeChanged(object sender, EventArgs e)
        {
            this.Height = this.Width;
        }



        /// <summary>
        /// 是否选中,当该控件状态为"已完成"时,点击该控件会将状态修改为"选中",当然再次点击可以取消选中。对于其他状态("等待中"、"进行中")则不做动作。
        /// 注意:当且仅当用户设置 Light_clickable = true 时该事件处理代码才会得到执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lightClick(object sender, EventArgs e)
        {
            if (_Light_clickable)
            {
                if (this.Curr_StatusCode == (int)Light_States.completed)
                {
                    this.SetStatus("pick");         //选中
                }
                else if(this.Curr_StatusCode == (int)Light_States.pick)
                {
                    this.SetStatus("completed");    //取消选中
                }
                else { }
            }
        }
    }
}
/* IndicatorLight.Designer.cs */

//注意命名空间修改为自己项目的命名空间
namespace WindowsFormsControlLibraryMadeByXJY
{
    partial class IndicatorLight
    {
        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Click += new System.EventHandler(this.lightClick);
            this.SizeChanged += new System.EventHandler(this.UCSignalLamp_SizeChanged);
        }

        #endregion
    }
}

4、使用方法: 

  • 在代码中通过设置该类实例化对象的Cursor属性可以更改鼠标指针位于控件上时显示的光标;
    /* 假设我们有一个 IndicatorLight1 对象 */
    IndicatorLight1.Cursor = Cursors.Arrow;
    ...
    
  • 通过设置Light_clickable属性可以更改该控件是否可以被点击;
    IndicatorLight1.Light_clickable = false;
    IndicatorLight1.Light_clickable = true;
  • 通过调用SetStatus()方法可以修改指示灯的状态(外部表现为颜色发生改变);
    IndicatorLight1.SetStatus("underway");
    IndicatorLight1.SetStatus("completed");
    ...
  • 通过获取GetStatus属性可以使用指示灯状态做一些简单的判断操作;
    if (IndicatorLight1.GetStatus == "pick")
    {
        ...
    }

5、效果演示: 

 Winform自定义控件 —— 指示灯文章来源地址https://www.toymoban.com/news/detail-444471.html

到了这里,关于Winform自定义控件 —— 指示灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IBM服务器指示灯报警说明

    ps   指示灯:当此指示灯发亮时,表明电源2 出现故障。 temp 指示灯:当此指示灯发亮时,表明系统温度超出阈值级别。 fan:当此指示灯点亮时,表明散热风扇或电源风扇出现故障或运行太慢。风扇发生故障还会导致over temp 指示灯发亮。 link指示灯:当此指示灯发亮时,网卡

    2024年03月09日
    浏览(62)
  • 服务器指示灯功能解析和代码示例

    服务器指示灯是服务器硬件上的小灯,用于显示服务器的状态和运行情况。这些指示灯通常位于服务器前面板或后面板上,并根据不同的颜色和闪烁模式来表示不同的状态。在本文中,我们将详细解析服务器指示灯的功能,并提供一些示例代码来控制这些指示灯。 服务器指示

    2024年02月20日
    浏览(35)
  • 电脑指示灯闪烁,但是无法开机的解决方案

    设备型号:联想 ThinkPad T14s 故障详情 :电脑使用后未关机锁屏合盖后,再次使用时开关机指示灯一直闪烁,但是无法正常开机。 其他尝试方法:尝试过长按开关机按键(无效),也听从联想维修客服指导 长按15秒开关机按键 反复3次,仍旧无果! 有效解决方法 :ThinkPad背板

    2024年02月01日
    浏览(34)
  • linux 网卡网口指示灯闪烁指令 centos 7

    现场交付项目的时候,经常出现网口顺序和网卡位置混乱的情况,这时可以用linux指令,使某个网卡的网口灯闪烁,以此来找到对应关系。 ethtool -p eth0 30  会让 eth0对应的物理网卡闪灯30秒 ,以此来判断哪块网卡是eth0,eth1 eth2等同理 比如这张图片红色箭头所指的位置,这个网

    2024年02月12日
    浏览(33)
  • 单片机原理及应用 实验三 指示灯循环控制

    单片机原理及应用(C51语言版) 实验三 指示灯循环控制 实验功能如下: 实现8个LED灯依次点亮的功能:P0.0→P0.1→P0.2→P0.3→ ┅ →P0.7→P0.6→P0.5→ ┅ →P0.0的顺序,无限循环,间隔约50ms。 环境配置: Proteus 7;Keil 步骤: 1.根据实验要求绘制电路图。   绘制时(1)选择并摆放

    2023年04月23日
    浏览(74)
  • 宽带猫指示灯各个的含义及日常问题解答

    如今很多家庭依然还是采用猫拨号上网,尽管猫一般也很少坏,但又时候也容易出各种网络问题,我们可以通过猫上面的指示灯来判断大致的问题,以下一起来看看猫指示灯的含义与常见问题解答。 热点相关:什么是猫(modem) 猫和路由器连接方法 猫指示灯的含义与常见问

    2024年02月05日
    浏览(41)
  • 如何通过无线路由故障指示灯查看故障发生在什么地方

    当无线路由器发生故障时,我们可以从控制面板上的指示灯状态,来判断故障发生在什么地方,本篇以腾达无线路由器介绍无线路由器故障时各种指示灯的状态,从分析这些灯的闪亮就可以判断是哪里出现问题了。 1、ADSL的Power灯 :电源显示,正常应长亮,不亮则表明没有通

    2024年02月05日
    浏览(74)
  • 【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率

    采用德飞莱STM32板,主控芯片STM32F103ZET6。 任务内容 :利用按键B1控制指示灯LD2的闪烁频率,闪烁频率设置为3档:初始状态时,LD2按照2Hz的频率闪烁;第一次按键后,LD2按照10 Hz的频率闪烁;第二次按键后,LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁,并重复

    2024年02月07日
    浏览(38)
  • Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真

    程序示例精选 Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真 如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助! 这篇博客针对Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真编写代码,代码整洁,规则,易读。 学习与应用推荐首选。 一、所需工

    2024年02月12日
    浏览(44)
  • 路由器连接网线后指示灯不亮该怎么办?

    按照正常的应用拓扑将电脑、路由器、猫连接起来后,如果对应路由器指示灯不亮,该问题可能与网线接触不良、故障、端口故障等原因相关,本文提供该问题的详细排查思路。 WAN口指示灯不亮 1、检查WAN口是否接线,检查与WAN口连接的猫是否供电(网线入户则无需排查)。

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包