首页 > 编程语言 >C#自定义控件—仪表盘

C#自定义控件—仪表盘

时间:2024-09-04 22:03:57浏览次数:3  
标签:控件 自定义 C# float 0.5 width new rec sf

C#用户控件之仪表盘

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

思路(GDI绘图):
定义属性:(仪表盘的半径、颜色、间隙;刻度圆的半径、颜色、字体;指针的颜色、占比;文本的字体、占比;)
绘制图形:(半圆、刻度、指针、中心、文本)


定义属性(将以上属性挨个敲完)

//量程属性(Font、Color、Float、Int、String、Bool)
private float range = 180.0f;
[Browsable(true)]
[Category("布局_G")]
[Description("量程")]
public float Range
{
    get { return range; }

    set
    {
        if (value < 0.0f) return;
        range = value; this.Invalidate();
    }
}


定义字段

private Graphics g;    //画布
private Pen p;         //笔-绘制线条、曲线
private SolidBrush sb; //笔(填充)-填充矩形、路径
private int width;
private int height;

仪表盘外环

//画外环的三个圆弧(DrawArc)
float angle = (180.0f - gapAngle * 2) / 3;   //定义角度
RectangleF rec = new RectangleF(10, 10, this.width - 20, this.width - 20);  //定义坐标、宽、高
p = new Pen(colorCircle1, outThickness); 
g.DrawArc(p, rec, -180.0f, angle);  //第一个弧
p = new Pen(colorCircle2, outThickness);
g.DrawArc(p, rec, -180.0f + angle + gapAngle, angle);   //第二个弧
p = new Pen(colorCircle3, outThickness); 
g.DrawArc(p, rec, -180.0f + angle * 2.0f + gapAngle + 2.0f, angle);   //第三个弧


仪表盘刻度

g.TranslateTransform(this.width * 0.5f, this.width * 0.5f);
点击查看代码
for (int i = 0; i < 4; i++)
{
    float actualAngle = -180.0f + 60.0f * i;
    double x1 = Math.Cos(actualAngle * Math.PI / 180);
    double y1 = Math.Sin(actualAngle * Math.PI / 180);
    float x = Convert.ToSingle(this.width * scaleProportion * 0.5f * x1);
    float y = Convert.ToSingle(this.width * scaleProportion * 0.5f * y1);

    StringFormat sf = new StringFormat();

    if (i > 1)
    {
        x = x - 60;
        sf.Alignment = StringAlignment.Far;
    }
    else
    {
        sf.Alignment = StringAlignment.Near;
    }

    //刻度的坐标,宽,高
    rec = new RectangleF(x, y, 60, 20);
    sb = new SolidBrush(scaleColor);

    if (range % 6 == 0)
    {
        g.DrawString((range / 3 * i).ToString(), scaleFont, sb, rec, sf);
    }
    else
    {
        g.DrawString((range / 3 * i).ToString("f1"), scaleFont, sb, rec, sf);
    }
} 

仪表盘中心点

//画中心(FillEllipse)
g.FillEllipse(new SolidBrush(pointColor), new RectangleF(-centerRadius, -centerRadius, centerRadius * 2.0f, centerRadius * 2.0f));

仪表盘指针

//画指针(DrawLine)
p = new Pen(pointColor, 3.0f);  //定义指针颜色、宽度
float sweepAngle = currentValue / range * 180.0f; //划过的角度
float z = this.width * 0.5f * scaleProportion - outThickness * 0.5f - 20.0f;  //指针长度
g.RotateTransform(90.0f); //默认开始角度
g.RotateTransform(sweepAngle);
g.DrawLine(p, new PointF(0, 0), new PointF(0, z));  //画一条线

下标文本标签

//写文本(DrawString)
g.RotateTransform(-sweepAngle);
g.RotateTransform(-90.0f);  //指定初始角度
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
rec = new RectangleF(this.width * (-0.5f), this.height * textProportion - 0.5f * this.width, this.width, this.height * (1.0f - this.scaleProportion));
string val = TextPrefix + currentValue.ToString() + "" + textUnit ;  //指定字符串
g.DrawString(val, textFont, new SolidBrush(textColor), rec, sf);  


最后生成(自定义各种监控值显示)


End

标签:控件,自定义,C#,float,0.5,width,new,rec,sf
From: https://www.cnblogs.com/guoenshuo/p/18395549

相关文章

  • 面向对象程序设计之链表 list 的简析(C++)
    简介:链表是一个双向的结构,与string与vector不同的是他不支持[]访问,因为链表是由一个节点一个节点连接而成的,并不连续。我们可以在常数量级内对于链表进行插入与删除数据1.构造函数我们在cplusplus.com中可以查到链表总共有四种构造的方式:1.无参构造(默认构造);2.使用n个va......
  • C语言程序设计(初识C语言后部分)
    十九,指针1)指针是什么?指针理解的2个要点:1,指针是内存中一个最小单元的编号,也就是地址2,平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量总结:指针就是地址,口语中说的指针通常指的是指针变量。指针变量:我们可以通过&(取地址操作符)取出变量的内存起始地址,把......
  • 深入了解链表 list 之的模拟实现 list (C++)
    1.基本框架关于链表我们知道其是一个双向循环结构,并且由许多节点组成,各个节点之间内存空间不一定连续,每个节点均有前驱指针与后继指针,下面我们使用类模版来实现一个适用于存储大部分数据类型的链表,由下面代码我们可以看到一些基础框架与很简单的函数size返回长度与empty判断......
  • C语言程序设计-练习篇
    少年自当扶摇上,揽星衔月逐日光。一,小乐乐走台阶描述:小乐乐上课需要走n阶台阶,因为腿长,所以每次可以选择走一阶或者两阶,那么他一共有多少种走法?输入描述:输入包含一个整数n(1<=n<=30)输出描述:输出一个整数,即小乐乐可以走的方法数#include<stdio.h>//小乐乐走台阶intf......
  • 【保姆级VSCode 插件开发之实现语音转文字其一】
    保姆级VSCode插件开发第一章VSCode插件开发入门之语音转文字记录文章目录保姆级VSCode插件开发前言一、创建新笔记文件1.生成新项目框架2.创建新笔记文件3.`package.json`注册命令4.效果展示总结前言本篇文章主要介绍开发一个VSCode插件实现语音转文字记......
  • GoPro HERO13 Black 图解 All In One
    GoProHERO13Black图解AllInOnehttps://gopro.com/zh/cn/shop/cameras/learn/hero13black/CHDHX-131-master.htmldemos(......
  • 前端开发学习——CSS定位
    一、定位的基本介绍1、网页常见的布局方式1.标准流块级元素独占一行——垂直布局行内元素/行内块元素一行显示多个——水平布局2.浮动可以让原本垂直布局的块级元素变成水平布局3.定位可以让元素自由的摆放在网页的任意位置一般用于盒子之间的层叠情况 2、定位的常见......
  • Profinet转EtherCAT协议转换网关(推荐收藏哦)
    在工业自动化领域,Profinet转EtherCAT两种网络协议的互通互联备受关注。其实有一款很不错的设备名为远创智控YC-PN-ECT,可以轻松解决这一问题。接下来作者从这款设备的主要功能、技术参数、性能优势及配置方法等方面深入阐述。这款网关性能优越,能够高效转换不同协议,为用户带来便......
  • 海外合规|新加坡网络安全认证计划简介(三)-Cyber Trust
    一、认证简介:     Cyber Trust标志是针对数字化业务运营更为广泛的组织的网络安全认证。该标志针对的是规模较大或数字化程度较高的组织,因为这些组织可能具有更高的风险水平,需要他们投资专业知识和资源来管理和保护其IT基础设施和系统。CyberTrust标志采用基......
  • EtherCAT转CANopen协议网关(推荐收藏呀)
    如何实现EtherCAT转CANopen从而达成两种网络协议的互通互联,是众多人关心的问题。事实上,远创智控YC-ECT-COP能够轻松化解这一难题。接下来,作者将从该设备的主要功能、技术参数、性能优势以及配置方法等多个方面为大家展开详细阐释。这款协议转化网关在工业自动化领域发挥着举足......