首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

C#自定义控件—仪表盘

编程知识
2024年09月04日 21:03

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

From:https://www.cnblogs.com/guoenshuo/p/18395549
本文地址: http://www.shuzixingkong.net/article/1739
0评论
提交 加载更多评论
其他文章 如何调用openai的TTS模型
这是24年1月份写的了,调用代码大概率有变动,仅供参考。 1 什么是OpenAI的TTS模型 OpenAI的TTS模型是一种文本到语音(Text-to-Speech)模型,它可以将给定的文本转换为自然语音音频。TTS代表Text-to-Speech,是一种人工智能技术,它使计算机能够模拟自然语言的声
如何调用openai的TTS模型
每天5分钟复习OpenStack(十五)Ceph与Bcache结合
上一章我们成功部署了bcache,这一章我们将Ceph与Bcache结合来使用,使用Bcache来为ceph的数据盘提速。 1 ceph 架构 一个标准的ceph集群可能是如下的架构,SSD/NVME 存储元数据,而SATA盘存储数据。这样的架构下,物理介质的SATA盘读写速率上限决定了存储集群Ce
每天5分钟复习OpenStack(十五)Ceph与Bcache结合 每天5分钟复习OpenStack(十五)Ceph与Bcache结合 每天5分钟复习OpenStack(十五)Ceph与Bcache结合
【Azure Policy】使用deployIfNotExists 把 Azure Activity logs 导出保存在Storage Account
问题描述 使用Azure Policy,对订阅下的全部Activity Log配置Diagnostic Setting,要求: 在Subscription或Management Group级别,针对未启用Activity Log功能的订阅,启用Activity Log功能; 对已经启用了Activi
【Azure Policy】使用deployIfNotExists 把 Azure Activity logs 导出保存在Storage Account 【Azure Policy】使用deployIfNotExists 把 Azure Activity logs 导出保存在Storage Account 【Azure Policy】使用deployIfNotExists 把 Azure Activity logs 导出保存在Storage Account
一个开源、跨平台的.NET UI框架 - Avalonia UI
前言 今天大姚给大家分享一个开源、免费(MIT License)、跨平台的.NET UI框架:Avalonia UI。 Avalonia是一个成熟稳定的平台,用于构建桌面、嵌入式、移动的和Web应用程序。一个代码库,无限可能!!! 项目介绍 Avalonia是一个强大的框架,使开发人员能够使用.NE
一个开源、跨平台的.NET UI框架 - Avalonia UI 一个开源、跨平台的.NET UI框架 - Avalonia UI 一个开源、跨平台的.NET UI框架 - Avalonia UI
代码整洁之道--读书笔记(1)
代码整洁之道 简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。 本书适合所有程序员阅读,
代码整洁之道--读书笔记(1)
基于 GoFrame 框架的 Go 项目打包成镜像,并上传至 Harbor 镜像库
〇、前言 在云服务时代最流行的部署方式就是容器部署,这也是最推荐的部署方式。 对于 GoFrame 框架就不多介绍了,直接来初始化一个 demo,备用。 // 初始化一个项目:gf-demo gf init gf-demo -u // -u 参数,是否将现有 goframe 框架更新为最新版本 //
基于 GoFrame 框架的 Go 项目打包成镜像,并上传至 Harbor 镜像库 基于 GoFrame 框架的 Go 项目打包成镜像,并上传至 Harbor 镜像库 基于 GoFrame 框架的 Go 项目打包成镜像,并上传至 Harbor 镜像库
全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆
数据结构是计算机科学中的一种组织和存储数据的方式,它决定了数据的访问方式和操作效率,数据结构的选择和实现对程序的性能和设计至关重要。本文主要讲述了如何使用Python语言和内置库实现常见数据结构。
全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆 全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆 全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆
Comfyui 基础教程(一) —— 本地安装部署
前言 前面一篇文章已经介绍过,ComfyUI 和 Stable Diffusion 的关系。不清楚的朋友,看传送门 Stable Diffusion 小白的入坑铺垫 。 WebUI 以及 ComfyUI 不等于 Stable Diffusion,可以简单粗暴一点的理解为方便运行某些大模型的工具。由于
Comfyui 基础教程(一) —— 本地安装部署 Comfyui 基础教程(一) —— 本地安装部署 Comfyui 基础教程(一) —— 本地安装部署