在开始阅读本文之前,如果您有学习创建自定义控件库并在其他项目中引用的需求,请参考:在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自定义控件 —— 指示灯相关推荐

  1. (一)c#Winform自定义控件-基类控件-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  2. (三十二)c#Winform自定义控件-表格

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. 印章WinForm自定义控件封装,提供源码下载

    看了"康忠鑫-Stephen"的文章(http://www.cnblogs.com/axing/archive/2013/06/04/3116328.html)知道了C#如何通过g ...

  4. Winform自定义控件 —— 水印文本框

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

  5. C# Winform自定义控件资源汇总(炫酷界面的零件)

    最近在用C#Winform做一个关于GNSS作业仿真的软件,这次界面想做的和别人写的WPF一样炫酷些,然而自定义控件太麻烦,于是就到网络搜索轮子哥造好的轮子,随着编程世界的开源化和中国程序员的崛起,有 ...

  6. winform自定义控件

    c#TabControl控件左边选项卡左边显示,文字横向显示 http://blog.csdn.net/kasama1953/article/details/52133713 WinForm中,给Te ...

  7. winform 自定义控件属性在属性面板中显示的问题

    我们做了自定义控件,在工具箱里拖出来的时候,想要直接在属性面板中直接编辑控件的自定义属性 我们可以用如下标签 代码 [Browsable(true)] [Description("属性描述& ...

  8. (十四)c#Winform自定义控件-键盘(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. c#WinForm自定义控件 渐变颜色的进度条

    C#WinForm工具箱自带的ProgressBar进度条控件的颜色默认为绿色,没有属性用来修改,很不方便.所以我们就需要重绘ProgressBar控件来达到我们想要的效果. 完成效果: 实现了进度条 ...

最新文章

  1. 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
  2. ASP.NET中数据缓存
  3. windows搭建gcc开发环境(msys2) objdump
  4. 求平方根的算法 牛顿迭代法和二分法
  5. mysql自增主键到头了怎么办_自增主键用完了怎么办
  6. jmeter 插件 监视器 图形界面使用
  7. mapbox 修改初始位置_《绝地求生》实用的键位改键推荐 | 哪些不合理的初始键位需要更改?...
  8. Django2.0异常:'Specifying a namespace in include() without providing an app_name '
  9. html支持图片文字的控件_[小工具][爬虫]一键完整备份你的Csdn博客文章(支持Markdown,HTML,文中图片)...
  10. 月考分析五年级英语html,第一学期五年级英语期末考试试卷分析
  11. Angular和Vue.js 深度对比
  12. python怎么加逗号_Python 逗号的巧用
  13. ESP32的SDK开发之获取SNTP网络时间
  14. Skyler2003的资源QwQ
  15. 【分享】揭发天气秀、桌面秀、雪狐等号称资源占用小的桌面软件的流氓行为!
  16. 01- SA8155P QNX LA/LV 启动(01) - startup
  17. ui设计现状与意义_UI设计的现状如何?
  18. 微信小程序文本输入<textarea/> 详解
  19. 计算机用户名大小写,windows计算机名大小写
  20. 限制Teams会议中的聊天

热门文章

  1. 新手学Python之学会查阅API文档
  2. Adobe Dreamweaver 放大代码字体
  3. stm32f103 GPIO——一灯大师之I/O口输出模式的寄存器配置
  4. angular请求数据
  5. 小白也能轻松搭建Discuz论坛
  6. 解决M1芯片的Homebrew安装问题--For M1使用者
  7. ctfshow pwn——PWN签到题、pwn02
  8. Redis事务和锁机制
  9. c语言long和 int,C语言 int 和long int 问题
  10. 会话管理(cookie和session)