实现效果如图:

javascript 仪表 winform仪表控件_sed

 

 

下面是代码.

public class Meter:Control
    {
          public Meter()
          {    //设置默认值
    this.Width = 200;
    this.Height = 160;
    BackColor = Color.CadetBlue;
    MeterBackColor = Color.Gray;
    StartColor = Color.Aqua;
    EndColor = Color.Blue;    //设置双缓冲,防止闪烁
    this.SetStyle(ControlStyles.DoubleBuffer,true);
    this.SetStyle(ControlStyles.UserPaint,true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
    this.Disposed += Meter_Disposed;
          }          private double _value;
          public double Value
          {
                get => _value;
                set
                {
                      _value = value;
                      this.Invalidate();
                }
          }
          public double MaxValue { get; set; }
          public double MinValue { get; set; }
          public Color MeterBackColor { get; set; }
          public Color StartColor { get; set; }
          public Color EndColor { get; set; }
          protected override void OnPaint(PaintEventArgs e)
          {
                base.OnPaint(e);
                var ownerrect = this.ClientRectangle;
                float w = ownerrect.Width * 0.8f;
                float h = ownerrect.Height * 0.8f;
                var g = e.Graphics;
                var mode = g.SmoothingMode;
                g.SmoothingMode = SmoothingMode.HighQuality;
                float angle = (float)(Value / (MaxValue - MinValue) * 360 );
                using ( var brush = new LinearGradientBrush(new Point(0,0) , new Point(ownerrect.Width , ownerrect.Height) , StartColor, EndColor) )
                using ( Pen p = new Pen(brush , 6) )
                {
                      p.Alignment = PenAlignment.Center;
                      p.StartCap = LineCap.Round;
                      p.EndCap = LineCap.Round;
                      g.DrawArc(p , ( ownerrect.Width - w ) / 2.0f , ( ownerrect.Height - h ) / 2.0f , w , h , 90 , angle);
                }
                using (Font font = new Font("微软雅黑", 22, FontStyle.Bold))
                {
                      using (Brush brush = new LinearGradientBrush(new Point(0 , 0) , new Point(ownerrect.Width,ownerrect.Height) , StartColor ,EndColor))
                      {
                            var size = e.Graphics.MeasureString(_value.ToString() , font);
                            var shade = new SolidBrush(Color.FromArgb(88,88,88,88));
                            g.DrawString(Value.ToString() , font , shade , (float) ( ( ownerrect.Width - size.Width ) / 2 + 2.5 ) , (float) ( ( ownerrect.Height - size.Height ) / 2 + 2.5));
                            shade.Dispose();
                            g.DrawString(Value.ToString() , font , brush , (float) ( ( ownerrect.Width - size.Width ) / 2 ) , (float) ( ( ownerrect.Height - size.Height ) / 2 ));
                    }
              }
              g.SmoothingMode = mode;        }
          protected override void OnPaintBackground(PaintEventArgs pevent)
          {
                base.OnPaintBackground(pevent);
                var ownerrect = this.ClientRectangle;
                float w = ownerrect.Width * 0.8f;
                float h = ownerrect.Height * 0.8f;
                var g = pevent.Graphics;
                var mode = g.SmoothingMode;
                g.SmoothingMode = SmoothingMode.HighQuality;
                using (Pen p = new Pen(MeterBackColor , 5))
                {
                      g.DrawArc(p , ( ownerrect.Width - w ) / 2.0f, ( ownerrect.Height - h ) / 2.0f , w , h , 0 , 360);
                }
                g.SmoothingMode = mode;
          }
    }