C#自定义控件—指示灯

news/2024/11/14 14:52:32/文章来源:https://www.cnblogs.com/guoenshuo/p/18397557

C#用户控件之指示灯

在体现通讯状态、运行状态等用一个靓眼的指示灯如何做?

思路(GDI)

  • 外环用笔绘制(Pen),内圆用画刷(SolidBrush);

两个方法(用笔画圆,用画刷填充圆的内部):

  1. 绘制边界RectangleF定义的椭圆/圆

DrawEllipse(Pen pen,RectangleF rect)

  1. 填充RectangleF定义边框的椭圆的内部

FillEllipse(Brush brush,RectangleF rect)


定义属性

  • 指示灯颜色、外环与边界的间隙、内圆与边界的间隙、外环宽度、当前颜色
//外环宽度
private float outWidth = 4.0f;
[Browsable(true)]
[Category("布局_G")]
[Description("外环的宽度")]
public float OutWidth
{get { return outWidth; }set{if (value <=0||value<0.1*this.Width ) return;outWidth = value; this.Invalidate();}
}

//颜色(Color)——备注:写5种颜色属性(灰色=Gray、棕色=DarkGoldenrod、红色=Red、蓝色=Blue、绿色=limeGreen<比Green好看些>)
private Color zcolor1 = Color.Gray;   //灰色.......写5种[Browsable(true)][Category("布局_G")][Description("颜色1")]public Color ZColor1{get { return zcolor1; }set { zcolor1 = value; this.Invalidate(); }}
//当前颜色获取(定义一个私有方法)(Int)private Color GetCurColor(){List<Color> colors = new List<Color>();colors.Add(zcolor1);colors.Add(zcolor2);colors.Add(zcolor3);colors.Add(zcolor4);colors.Add(zcolor5);return colors[curValue];}
//间隙(float),属性都是一个样往下敲就是
注意:间隙设置值的范围(外环间隙要小于内圆间隙)

GDI绘制图形:(外环、内圆)

Color getCurColor = GetCurColor();  //获取当前颜色//绘制外环(DrawEllipse-用笔画椭圆)
p = new Pen(getCurColor, outWidth);
RectangleF rec = new RectangleF(this.gapOut, this.gapOut, this.width - 2 * this.gapOut, this.height - 2 * gapOut);
g.DrawEllipse(p, rec);//绘制内圆(FillEllipse-填充椭圆内部)
sb = new SolidBrush(getCurColor);
rec = new RectangleF(gapIn, gapIn, this.width - 2 * this.gapIn, this.height - 2 * gapIn);
g.FillEllipse(sb, rec);

最后生成(闪烁的话,是不是对用户更友好呢)


两种闪烁方法

关键在于timer定时器的使用,在定时器的Tick方法中定义变量更替


【1】只内圆闪烁(定义内圆画刷颜色Transparent<透明色>、GetCurColor<当前色>两种画刷)

if (this.flickerAct == true)
{if (this.blink == true)  //将blink标志位在定时器的Tick方法中取反 (blink=!blink){sb = new SolidBrush(zcolor6);  //zcolor6为透明色}else{sb = new SolidBrush(getCurColor);  //getCurColor为当前色}
}
else
{sb = new SolidBrush(getCurColor);  //不闪烁就定义当前色画刷
}
rec = new RectangleF(gapIn, gapIn, this.width - 2 * this.gapIn, this.height - 2 * gapIn);
g.FillEllipse(sb, rec);

【2】整体都闪烁(定义控件的Visible)

 private void MyTimer_Tick(object sender, EventArgs e)  //定时器Tick事件方法{if (this.flickerVis == true){//显隐控件this.Visible=!this.Visible;  //整体闪烁只定义Visible即可this.blink=false;}else{//内圆闪烁标志this.blink = !this.blink;}this.Invalidate();}

【3】频率可调(定时器的Interval)


private bool flickerAct = false;
[Browsable(true)]
[Category("布局_G")]
[Description("是否闪烁")]
public bool FlickerAct
{get { return flickerAct; }set{if (value == true){myTimer.Interval = this.flickerFre;  //传递给定时器Interval 一个int(毫秒刷新率)值即可this.myTimer.Start();  //闪烁定时器开始}else{this.myTimer.Stop();  //不闪烁定时器停止;同时将标志位、显示置为默认值this.blink = false;this.Visible = true;}flickerAct = value; this.Invalidate();}
}

闪瞎双眼,捂脸


想要二进制使用示例

  private void led1_Load(object sender, EventArgs e){bool b = false;//三元运算定义两种颜色即可this.led1.CurValue = b ? 2 : 3; }

End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/792829.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0认识竞品分析(附实战分析抖音)

什么是竞品分析?顾名思义,是对竞争对手的产品进行比较分析的过程,一种带有主观性的横向分析过程;通过对多个产品的整体架构、功能、商业模式、产品策略等多维度的横向对比分析,从而获得目的性的结论。那如何分析呢?我们这里按照下面几个点来一一展开:**明确目的,行业分…

sql注入(极客大挑战2019EasySQL1)

题目链接我们输入 http://643dcead-c254-412c-a4fe-5787862bbf9e.node5.buuoj.cn:81/check.php?username=admin and password=13123响应为如下,提示我们输入password,看似url中查询了password,但是因为这是一个字符型注入,后台url转为 SELECT * FROM users WHERE username…

ATTCK红队评估(红日靶场1)

前言博主小白一个,各位大佬勿喷,前前后后,学了挺久的,学了之后又忘了,因此来打红日靶场1巩固知识。文章写的不是很好,缺少很多细节,博主也是内网小白,很多都不懂,互相学习 靶机介绍​本靶机环境是红日团队开源的一个红队实战测试环境,靶机下载地址如下:​http://vul…

地理信息科学在考古学中的应用:GIS与遥感技术的时空穿梭之旅

在历史的长河中,每一片土地都承载着文明的记忆。随着科技的进步,地理信息科学(GIS)与遥感技术正逐渐揭开古老秘密的面纱,让沉睡千年的历史遗迹重新焕发光彩。今天,就让我们踏上一场穿越时空的旅程,探索GIS和遥感技术如何在考古发掘和研究中扮演着至关重要的角色。 GIS:…

【漏洞分析】Penpie 攻击事件:重入攻击构造奖励金额

背景信息 2024 年 9月 3日,Penpie 合约遭受重入攻击,攻击者在重入阶段向合约添加流动性来冒充奖励金额,从而获取合约内原有的奖励代币。资产损失高达 2734 万美元。 2024 年 5月,Penpie 平台新增了推出了无需许可的资产池功能,即允许 Pendle 上的用户可以在该平台上自建任…

8.30域横向-PTHPTKPTT票据传递

知识点 Kerberos协议具体工作方法,在域中: 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)。 将TGT进行加密签名返回给客户机器,只有域用户krbtgt才能…

系统设计思想之Domain驱动

一、DDD从放弃到入门 希望了解一套微服务框架的;希望学习到新技术的;开发的系统不复杂,模块少而独立的;当前自己设计的架构已满足拓展性,可复用性,技术与业务复杂度已分离的;这几类人群不是DDD的目标人群,建议尽早放弃,学习领域驱动设计能得到的收获概括起来大致如…

逻辑回归模型

核心:线性回归+sigmoid映射。 一、概述逻辑回归模型(Logistic Regression,LR),由名称上来看,似乎是一个专门用于解决回归问题的模型,事实上,该模型更多地用于解决分类问题,尤其是二分类问题。这并不矛盾,因为逻辑回归直接输出的是一个连续值,我们将其按值的大小进行切…

Winform下的画板

1. Winform如何实现简单绘图如果想要自己画一个圆,矩形或者其他图形,可以使用控件或窗体自带的Paint事件,在事件中引用Graphics对象; 也可以使用某个窗体或者控件的CreateGraphics方法 需要引用using System.Drawing.Drawing2D;(要画3D就用DirectX)2. 使用Form1窗体Paint…

STM32学习笔记——Keil uVision5建项目

新建文件夹——用于存放工程及工程管理 新建文件夹用于存放整个工程打开“stm32-project”文件夹,新建一些文件夹用于工程源代码的分类这些文件夹都是自己建的用于不同类型代码存放,文件夹个数,命名都因人而异。(后续所有文件放在“stm32-project”中也行,不嫌乱的话) Ha…

Jenkins - 触发器

触发方式 jenkins自带的job触发方式Generic Webhook Trigger插件 在需要外界其他系统触发Jenkins任务的场景,通常使用Generic Webhook Trigger插件来配置 Jenkins 触发器 Generic Webhook Trigger 插件允许使用 Webhook将外部系统与 Jenkins 集成。 通过配置 Webhook,在特定事…

[场景设计]短网址服务

如何设计一个短网址服务(TinyURL)? 使用场景(Scenario) 微博和Twitter都有140字数的限制,如果分享一个长网址,很容易就超出限制,发不出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。 需求(Needs) 很显然,要尽可能的短。长度设计为多少才合适呢? 短网…