翼度科技»论坛 编程开发 .net 查看内容

C#自定义控件—仪表盘

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
C#用户控件之仪表盘

如何让温度、湿度、压力等有量程的监控值如仪表盘(DashBoard)一样显示?

思路(GDI绘图):
定义属性:(仪表盘的半径、颜色、间隙;刻度圆的半径、颜色、字体;指针的颜色、占比;文本的字体、占比;)
绘制图形:(半圆、刻度、指针、中心、文本)
定义属性(将以上属性挨个敲完)
  1. //量程属性(Font、Color、Float、Int、String、Bool)
  2. private float range = 180.0f;
  3. [Browsable(true)]
  4. [Category("布局_G")]
  5. [Description("量程")]
  6. public float Range
  7. {
  8.     get { return range; }
  9.     set
  10.     {
  11.         if (value < 0.0f) return;
  12.         range = value; this.Invalidate();
  13.     }
  14. }
复制代码
定义字段
  1. private Graphics g;    //画布
  2. private Pen p;         //笔-绘制线条、曲线
  3. private SolidBrush sb; //笔(填充)-填充矩形、路径
  4. private int width;
  5. private int height;
复制代码
仪表盘外环
  1. //画外环的三个圆弧(DrawArc)
  2. float angle = (180.0f - gapAngle * 2) / 3;   //定义角度
  3. RectangleF rec = new RectangleF(10, 10, this.width - 20, this.width - 20);  //定义坐标、宽、高
  4. p = new Pen(colorCircle1, outThickness);
  5. g.DrawArc(p, rec, -180.0f, angle);  //第一个弧
  6. p = new Pen(colorCircle2, outThickness);
  7. g.DrawArc(p, rec, -180.0f + angle + gapAngle, angle);   //第二个弧
  8. p = new Pen(colorCircle3, outThickness);
  9. g.DrawArc(p, rec, -180.0f + angle * 2.0f + gapAngle + 2.0f, angle);   //第三个弧
复制代码
仪表盘刻度
  1. g.TranslateTransform(this.width * 0.5f, this.width * 0.5f);
复制代码
点击查看代码
  1. for (int i = 0; i < 4; i++)
  2. {
  3.     float actualAngle = -180.0f + 60.0f * i;
  4.     double x1 = Math.Cos(actualAngle * Math.PI / 180);
  5.     double y1 = Math.Sin(actualAngle * Math.PI / 180);
  6.     float x = Convert.ToSingle(this.width * scaleProportion * 0.5f * x1);
  7.     float y = Convert.ToSingle(this.width * scaleProportion * 0.5f * y1);
  8.     StringFormat sf = new StringFormat();
  9.     if (i > 1)
  10.     {
  11.         x = x - 60;
  12.         sf.Alignment = StringAlignment.Far;
  13.     }
  14.     else
  15.     {
  16.         sf.Alignment = StringAlignment.Near;
  17.     }
  18.     //刻度的坐标,宽,高
  19.     rec = new RectangleF(x, y, 60, 20);
  20.     sb = new SolidBrush(scaleColor);
  21.     if (range % 6 == 0)
  22.     {
  23.         g.DrawString((range / 3 * i).ToString(), scaleFont, sb, rec, sf);
  24.     }
  25.     else
  26.     {
  27.         g.DrawString((range / 3 * i).ToString("f1"), scaleFont, sb, rec, sf);
  28.     }
  29. }
复制代码
仪表盘中心点
  1. //画中心(FillEllipse)
  2. g.FillEllipse(new SolidBrush(pointColor), new RectangleF(-centerRadius, -centerRadius, centerRadius * 2.0f, centerRadius * 2.0f));
复制代码
仪表盘指针
  1. //画指针(DrawLine)
  2. p = new Pen(pointColor, 3.0f);  //定义指针颜色、宽度
  3. float sweepAngle = currentValue / range * 180.0f; //划过的角度
  4. float z = this.width * 0.5f * scaleProportion - outThickness * 0.5f - 20.0f;  //指针长度
  5. g.RotateTransform(90.0f); //默认开始角度
  6. g.RotateTransform(sweepAngle);
  7. g.DrawLine(p, new PointF(0, 0), new PointF(0, z));  //画一条线
复制代码
下标文本标签
  1. //写文本(DrawString)
  2. g.RotateTransform(-sweepAngle);
  3. g.RotateTransform(-90.0f);  //指定初始角度
  4. StringFormat sf = new StringFormat();
  5. sf.Alignment = StringAlignment.Center;
  6. rec = new RectangleF(this.width * (-0.5f), this.height * textProportion - 0.5f * this.width, this.width, this.height * (1.0f - this.scaleProportion));
  7. string val = TextPrefix + currentValue.ToString() + "" + textUnit ;  //指定字符串
  8. g.DrawString(val, textFont, new SolidBrush(textColor), rec, sf);  
复制代码
最后生成(自定义各种监控值显示)
   
   

End


来源:https://www.cnblogs.com/guoenshuo/p/18395549
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具