如何使用C#开发一个如上的工业仪表盘控件呢?
1写一个类继承自UserControl,我们给它起名为Dial
2定义他的刻度属性,
  public int V//当前刻度1,省略VV(刻度2)
  {
   get
   {
    return mV;
   }
   set
   {
    if(mV==value)return;
    mV=value;
    Refresh();
   }
  }
  public int MaxMain//最大刻度 省略MaxM(刻度二的最大值)
  {
   get
   {
    return mMaxMain;
   }
   set
   {
    if(mMaxMain==value)return;
    mMaxMain=value;  
    Refresh();
   }
  }
3在它的绘图事件下写下绘制表盘的代码(呵呵,这是重点呃)
  private void Dial_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {

Rectangle rect1=this.ClientRectangle;
   rect1.Y+=3;
   rect1.Height=rect1.Width;
   e.Graphics.DrawArc(Pens.DarkGray,rect1,180+30,120);//画表盘圆弧1

Rectangle rect2=this.ClientRectangle;
   rect2.Y+=3;
   rect2.X+=15;
   rect2.Y+=15;
   rect2.Width-=30;
   rect2.Height=rect2.Width;
   e.Graphics.DrawArc(Pens.DarkGray,rect2,180+30,120);//画表盘圆弧2
   Rectangle rect3=rect2;
   rect3.X+=50;
   rect3.Y+=50;
   rect3.Width-=100;
   rect3.Height-=100;
   e.Graphics.DrawArc(Pens.DarkGray,rect3,180+30,120);//画表盘圆弧3

Rectangle rect4=rect2;
   rect4.X+=10;
   rect4.Y+=10;
   rect4.Width-=20;
   rect4.Height-=20;
   e.Graphics.DrawArc(Pens.DarkGray,rect4,180+30,120);//画表盘圆弧4

int ox=rect1.Width/2+rect1.Left;
   int oy=rect1.Height/2+rect1.Top;

double rad=0;
   Point pt1=new Point(0,0);
   Point pt2=new Point(0,0);

for(int i=0;i<120/10;i++)//画大刻度
   {
    double _rad=PEI/180*10;
    rad=(_rad*i+(PEI/180*30));
    pt1=Trans(rect1.Width/2,rad,ox,oy);
    pt2=Trans(rect2.Width/2,rad,ox,oy);
    e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);
    pt1=Trans(rect2.Width/2,rad,ox,oy);
    pt2=Trans(rect4.Width/2,rad,ox,oy);
    e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);

}
   for(int i=0;i<120/2;i++)//画细刻度
   {
    double _rad=PEI/180*2;
    rad=(_rad*i+(PEI/180*30));
    pt1=Trans(rect1.Width/2,rad,ox,oy);
    pt2=Trans(rect1.Width/2-5,rad,ox,oy);
    e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);
    pt1=Trans(rect2.Width/2,rad,ox,oy);
    pt2=Trans(rect2.Width/2-5,rad,ox,oy);
    e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);
   }
   pt1=Trans(rect1.Width/2,PEI/180*30,ox,oy);
   pt2=Trans(rect3.Width/2,PEI/180*30,ox,oy);
   e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);//画表盘直边1
   pt1=Trans(rect1.Width/2,PEI/180*150,ox,oy);
   pt2=Trans(rect3.Width/2,PEI/180*150,ox,oy);
   e.Graphics.DrawLine(Pens.DarkGray,pt1,pt2);//画表盘直边2
   double v=120;
   v/=MaxMain;
   v*=V;
   v=(PEI/180*v+PEI/180*30);
   pt1=Trans(rect1.Width/2,v,ox,oy);
   pt2=Trans(rect2.Width/2,v,ox,oy);
   e.Graphics.DrawLine(Pens.Red,pt1,pt2);//画指针1

v=120;
   v/=MaxMain;
   v*=VV;
   v=(PEI/180*v+PEI/180*30);
   pt1=Trans(rect2.Width/2,v,ox,oy);
   pt2=Trans(rect4.Width/2,v,ox,oy);
   e.Graphics.DrawLine(Pens.Red,pt1,pt2);//画指针2

pt1=Trans(rect3.Width/2-5,PEI/180*50,ox,oy);
   pt2=Trans(rect3.Width/2-5,PEI/180*130,ox,oy);
   Rectangle tr=new Rectangle(pt2,new Size(pt1.X-pt2.X,15));
   FontFamily fontFamily = new FontFamily("Arial");
   Font font = new Font(
    fontFamily,
    9,
    FontStyle.Regular,
    GraphicsUnit.Point);
   e.Graphics.DrawRectangle(Pens.DarkBlue,tr);
   e.Graphics.DrawString(V.ToString()+"."+VV.ToString(),font,Brushes.Red,tr);//绘制数字窗口
   font.Dispose();
   
  }

好像一切都挺顺利,Trans(rect2.Width/2,v,ox,oy);这个东东干什么的?
这其实正是核心,让我们一起看看:
  private Point Trans(int r,double rad,int ox,int oy)
  {
   Point pt=new Point(0,0);
   int xx=(int)(r*Math.Cos(rad));
   int yy=(int)(r*Math.Sin(rad));
   pt.Y=-yy;
   pt.X=xx;
   pt.X+=ox;
   pt.Y+=oy;
   return pt;

}
其实它是求以ox,oy为坐标原点的一个极坐标系中的点所对应的系统中的点的。
x=r×cos(rad)
y=r×sin(rad)
很熟悉吧?
因为我们和圆弧打交道用极坐标很方便和强大,所以在Dial_Paint()中坐标在计算时都是用极坐标来描述的,在绘图时用Trans()得到GDI的直角坐标!

怎样用C#写一个工业仪表盘控件相关推荐

  1. chart控件做实时曲线显示_基于GDI+技术开发工业仪表盘控件

    写在前面 上次给大家看了一个上位机界面之后,很多人表示对那个仪表盘的开发感兴趣,今天就跟大家分享一下整个的开发过程,由于整个仪表盘开发的过程还是有些复杂的,无法将所有的代码都一一展示,所以重点跟大家分 ...

  2. 【Android View】写一个蛛网评分控件

    上周项目中要用到一个蛛网评分控件,于是就先上Github搜,搜了半天没搜着(也可能是我搜的关键词不对),那只好自己写一个了,就叫SpiderWebScoreView 先放一张最终效果图: 先整理一下需 ...

  3. WPF自定义仪表盘控件

    WPF自定义仪表盘控件 一.前言 二.功能实现 一.前言 在学习和工作中使用WPF时,都离不开自定义控件的使用,今天分享一个自己在学习过程中使用到的一个自定义仪表盘控件,感觉挺不错的,在这里分享给大家 ...

  4. 制作一个GUI仪表盘,安排!LVGL『Gauge仪表盘控件』介绍

    一. LVGL GUI仪表盘控件的概念 仪表盘是一种带有刻度标签和一根或多根针的仪表.比如车速/车转速等 二. LVGL GUI仪表盘小部件和样式 量规的主要部分称为 LV_GAUGE_PART_MA ...

  5. VB调用C#写的WinForm.NET控件

    点击下载本文配套的演示程序代码http://files.cnblogs.com/xdesigner/VB-CS-WinformControl.zip. 一.前言: 虽然IT开发技术日新月异,不过业界仍 ...

  6. 使用DELPHI编写一个小的控件

    好久没有来了,今天终于有时间了,可以来写写关于控件开发的文章了.           今天我以我4年前写的一个小控件为例写一下如何开发控件的方法.           这个控件实现后的效果可见附件1. ...

  7. 如何用 Swift 语言构建一个自定控件

    本文译自:How To Make a Custom Control in Swift 用户界面控件是所有应用程序重要的组成部分之一.它们以图形组件的方式呈现给用户,用户可以通过它们与应用程序进行交互. ...

  8. 转载几篇别人写的皮肤类控件的技术文章

    转载几篇别人写的皮肤类控件的技术文章 原连接:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html 实现控件的透明背景 很多情况下,我们需要控件 的 ...

  9. CropImageView android上的一个图片裁剪控件

    CropImageView **文前:**本文非常容易让读者看的云里雾里,建议直接看效果图,觉得有用就去看源码吧. CropImageView的原型来自Cropimage_demo,是android上 ...

最新文章

  1. AddressSanitizer+cmake
  2. linux c语言tcp,我个人的Linux TCP server和client测试源码,C语言(2)(★firecat推荐★)...
  3. ---Mybatis3学习笔记(2)
  4. “7th-place-solution-microsoft-malware-prediction”——kaggle微软恶意代码检测比赛第七名代码
  5. 基于Neutron的Kubernetes SDN实践经验之谈
  6. Linux networkmanager
  7. 15.枚举enum.rs
  8. Eigen入门之密集矩阵 8 - resharp slicing切片
  9. 整个csdn网站处于不死不活的状态
  10. Linux tar命令
  11. 位运算 取某一位 java_Java 位运算妙用
  12. 74LV165与74HC595 使用
  13. 病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御
  14. 腾讯实习生招聘之总体感悟
  15. 【人工智能】图灵测试
  16. Eclipse SVN:E200030:There are unfinished transactions detected
  17. android load BKS error: wrong version of key store
  18. 一般博士毕业能进什么样的高校当老师?网友:看第一学历!
  19. Linux网络编程中EAGAIN错误和EINTR错误
  20. Proteus VSM Studio汇编 + 蜂鸣器播放谱曲八月桂花香

热门文章

  1. 传智健康——五、预约套餐管理(详细功能实现)
  2. excel文件每行数据按模板批量导出为一个excel文件
  3. Android HTTPS、TLS版本支持相关解决方案
  4. foxmail企业邮件服务器,如何用foxmail连接企业邮箱?
  5. Ubuntu查看定时任务执行日志
  6. 基于Javamail的邮件收发系统的设计与开发
  7. 19CRAC静默安装模板
  8. php7 imagick扩展,浅谈php扩展imagick
  9. 百度黄埔学院二期开学,未来“首席AI架构师”齐报道
  10. 菜鸟教程python3在线工具_3个非常实用的Python爬虫工具,你会几个?