C#自定义控件—指示灯
C#用户控件之指示灯
在体现通讯状态、运行状态等用一个靓眼的指示灯如何做?

思路(GDI)
- 外环用笔绘制(Pen),内圆用画刷(SolidBrush);
两个方法(用笔画圆,用画刷填充圆的内部):
- 绘制边界RectangleF定义的椭圆/圆
DrawEllipse(Pen pen,RectangleF rect)
- 填充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
C#自定义控件—指示灯的更多相关文章
- C#自定义控件开发(2)—LED指示灯
下面来开发一个LED指示灯控件,如下: 设计属性包括: 外环宽度,外环间隙,内环间隙,颜色[五种],当前值. 由于该LED指示灯基本是完全独立设计的,并不是在某个控件的基础上进行的开发,因此,这里使 ...
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- ASP.NET MVC学习之母版页和自定义控件的使用
一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- 自定义控件之 圆形 / 圆角 ImageView
一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- 如何开发FineReport的自定义控件?
FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...
- WPF自定义控件第二 - 转盘按钮控件
继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...
- 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的
前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...
- WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
随机推荐
- Blazor Server App Cannot find the fallback endpoint specified by route values
github官方issues中提到的解决方案,CreateBuilder时指定项目绝对路径可以解决. 1 // 指定项目路径,也可以用Assembly.GetCallingAssembly获取 2 c ...
- nodejs-mime类型
mime是一个互联网标准,通过设定它就可以设定文件在浏览器的打开方式. mime使用方法: 使用mime模块查询文件的MIME类型: mime.getType('/path/to/file.txt') ...
- django.db.utils.InternalError: (1050, "Table 'app01_book_author' already exists")
Django项目在执行 python manage.py migrate进行表迁移时报错 错误截图: 解决方法执行: 问题解决!!!
- 火山引擎数智平台赋能火花思维,A/B测试加速创新
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车.这一效果的背后,离不开火花思 ...
- 【RocketMQ 系列】 RocketMQ 双主双从(同步双写) 集群搭建
1. 各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输信息:举例:邮局 NameServer:管理Broker:举例:各个 ...
- redis基本数据结构-列表
redis基本数据结构-列表list 特性 每个列表键最多存储 2^32 - 1个字符串元素 元素在列表中有序 元素在列表中不唯一 向列表左侧添加元素 lpush key value lpush nu ...
- VBA | 统计数组某元素出现的次数,适用于一维、二维数组
很简单的需求,但是中文网络上基本都是循环的方法,经过查找下面的方法很有效.为了方便用户的使用,进行了如下的整改. 1 Sub Statistics_Number_of_occurrences_test ...
- Vue bug from backend
一个后端引发前端的BUG 使用的框架是vue 代码里面有一个组件 <table :data="data"/> 获取后台数据 this.data = await fetc ...
- [oeasy]python0117 文字的演化_埃及圣书体_象形文字_楔形文字
埃及圣书体 回忆上次内容 两河流域 苏美尔文明 所使用的 楔形文字 不是象形文字 添加图片注释,不超过 140 字(可选) 楔形文字的字型 究竟是怎么来的呢? 巴别塔 苏美尔的 ...
- [oeasy]教您玩转python - 0005- 勇闯地下城
继续运行 回忆上次内容 上次从1行代码进化到了2行代码 yy p粘贴剪贴板中的内容 将剪贴板中的代码粘贴9999次 9999p 真的实现了万行代码梦 是真·圆梦 没有撒谎的那种 不过圆梦之后多少 ...