C#自定义控件—指示灯

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

相关推荐
△曉風殘月〆5 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風7 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747410 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo10 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo12 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发13 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术13 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒13 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル15 小时前
C# EF 使用
c#
丁德双16 小时前
winform 加载 office excel 插入QRCode图片如何设定位置
c#·excel