C#控件开发4—仪表盘

目录

  • 思路(GDI绘图)
  • 1.定义属性
  • 2.绘制图形
  • 3.最后生成(自定义各种监控值显示)
  • End

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

思路(GDI绘图)

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

1.定义属性

  • 将以上属性挨个敲完
        private Color colorCircle1 = Color.FromArgb(33, 80, 33);[Browsable(true)][Category("布局_G")][Description("外环颜色1")]public Color ColorCircle1{get { return colorCircle1; }set { colorCircle1 = value; this.Invalidate(); }}private Color colorCircle2 = Color.FromArgb(22, 128, 22);[Browsable(true)][Category("布局_G")][Description("外环颜色2")]public Color ColorCircle2{get { return colorCircle2; }set { colorCircle2 = value; this.Invalidate(); }}private Color colorCircle3 = Color.FromArgb(20, 181, 20);[Browsable(true)][Category("布局_G")][Description("外环颜色3")]public Color ColorCircle3{get { return colorCircle3; }set { colorCircle3 = value; this.Invalidate(); }}private Color pointColor = Color.Green;[Browsable(true)][Category("布局_G")][Description("指针颜色")]public Color PointColor{get { return pointColor; }set { pointColor = value; this.Invalidate(); }}private Color scaleColor = Color.Black;[Browsable(true)][Category("布局_G")][Description("刻度颜色")]public Color ScaleColor{get { return scaleColor; }set { scaleColor = value; this.Invalidate(); }}private float scaleProportion = 0.8f;[Browsable(true)][Category("布局_G")][Description("刻度圆占外圆的比例0-1:越大越紧挨")]public float ScaleProportion{get { return scaleProportion; }set{if (value > 1.0f || value < 0.0f) return;scaleProportion = value; this.Invalidate();}}private Font scaleFont = new Font(new FontFamily("微软雅黑"), 10.0f);[Browsable(true)][Category("布局_G")][Description("字体格式")]public Font ScaleFont{get { return scaleFont; }set{if (value != null){scaleFont = value;this.Invalidate();}}}private string textPrefix = "实际温度:";[Browsable(true)]  //说明:文本关闭[Category("布局_G")][Description("文本前缀")]public string TextPrefix{get { return textPrefix; }set { textPrefix = value; this.Invalidate(); }}private string textUnit = "℃";[Browsable(true)]  //说明:文本关闭[Category("布局_G")][Description("文本单位")]public string TextUnit{get { return textUnit; }set { textUnit = value; this.Invalidate(); }}private Font textFont = new Font("Segoe UI", 10.5f);[Browsable(true)][Category("布局_G")][Description("字体格式")]public Font TextFont{get { return textFont; }set{if (value != null){textFont = value;this.Invalidate();}}}private Color textColor = Color.Black;[Browsable(true)][Category("布局_G")][Description("指针颜色")]public Color TextColor{get { return textColor; }set { textColor = value; this.Invalidate(); }}private float textProportion = 0.88f;[Browsable(true)][Category("布局_G")][Description("文本显示高度占比0-1;越小越靠上")]public float TextProportion{get { return textProportion; }set{if (value > 1.0f || value < 0.0f) return;textProportion = value; this.Invalidate();}}private bool textShow = true;[Browsable(true)][Category("布局_G")][Description("是否显示文本")]public bool TextShow{get { return textShow; }set{textShow = value; this.Invalidate();}}private float currentValue = 100.0f;[Browsable(true)][Category("布局_G")][Description("实时值显示")]public float CurrentValue{get { return currentValue; }set{if (value < 0.0f || value > range) return;currentValue = value; this.Invalidate();}}private int outThickness = 5;[Browsable(true)][Category("布局_G")][Description("外环画笔的宽度")]public int OutThickness{get { return outThickness; }set{if (value <= 0) return;outThickness = value; this.Invalidate();}}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 float centerRadius = 6.0f;[Browsable(true)][Category("布局_G")][Description("中心半径")]public float CenterRadius{get { return centerRadius; }set{if (value <= 0.0f) return;centerRadius = value; this.Invalidate();}}private float gapAngle = 2.0f;[Browsable(true)][Category("布局_G")][Description("间隙角度")]public float GapAngle{get { return gapAngle; }set{if (value <= 0.0f) return;gapAngle = value; this.Invalidate();}}#endregion 

2.绘制图形

  • 定义画布、笔
  • 画布质量
  • 画外环-定义角度、坐标、宽度、高度
  • 画内圆
  • 画指针
  • 文本标签
private Graphics g;    //画布
private Pen p;         //笔-绘制线条、曲线
private SolidBrush sb; //笔(填充)-填充矩形、路径
private int width;
private int height;
 #region 重绘【画外圆、画刻度、画指针、画中心、画文本】protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);//画布质量g = e.Graphics;g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;this.width = this.Width;this.height = this.Height;//特殊情况处理if (this.width <= 20 || this.height <= 20) return;if (this.height < this.width * 0.5f) return;// 画外环-定义角度、坐标、宽度、高度float angle = (180.0f - gapAngle * 2) / 3;RectangleF rec = new RectangleF(10, 10, this.width - 20, this.width - 20);//第一个圆弧p = new Pen(colorCircle3, 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(colorCircle1, 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);}}//画内圆g.FillEllipse(new SolidBrush(pointColor), new RectangleF(-centerRadius, -centerRadius, centerRadius * 2.0f, centerRadius * 2.0f));//画指针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));//文本标签if (textShow){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 + "(" + (currentValue / range * 100.0f).ToString("f0") + "%" + ")";string val = TextPrefix + currentValue.ToString() + "" + textUnit ;//文本g.DrawString(val, textFont, new SolidBrush(textColor), rec, sf);}}#endregion

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


End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 我们先实现一…

数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例

摘要&#xff1a; 在数字化转型的浪潮中&#xff0c;零售行业正经历着前所未有的变革。特别是在供应链管理方面&#xff0c;线上线下融合、数据孤岛、消费者需求多样化等问题日益凸显&#xff0c;对零售企业的运营效率与市场竞争力构成了严峻挑战。本文深入探讨了零售行业供应…

RabbitMQ - 4 ( 22000 字 RabbitMQ 入门级教程 )

一&#xff1a; RabbitMQ 高级特性 前面主要讲解了 RabbitMQ 的概念和应用。RabbitMQ 实现了 AMQP 0-9-1 规范&#xff0c;并在此基础上进行了多项扩展。在 RabbitMQ 官方网站中详细介绍了其特性&#xff0c;我们将其中一些重要且常用的特性挑选出来进行讲解。 1.1 消息确认 …

mac m2 安装 docker

文章目录 安装1.下载安装包2.在downloads中打开3.在启动台打开打开终端验证 修改国内镜像地址小结 安装 1.下载安装包 到官网下载适配的安装包&#xff1a;https://www.docker.com/products/docker-desktop/ 2.在downloads中打开 拖过去 3.在启动台打开 选择推荐设置 …

QT--------网络

实现思路 主机信息查询&#xff1a; 使用 QHostInfo 类可以查询主机名和 IP 地址信息。QNetworkInterface 类可以获取本地网络接口的信息&#xff0c;包括 IP 地址、子网掩码、广播地址等。 TCP 通信&#xff1a; 使用 QTcpServer 类实现 TCP 服务器端程序设计。使用 QTcpSock…

智能边缘计算×软硬件一体化:开启全场景效能革命新征程(企业开发者作品)

边缘智能技术快速迭代&#xff0c;并与行业深度融合。它正重塑产业格局&#xff0c;催生新产品、新体验&#xff0c;带动终端需求增长。为促进边缘智能技术的进步与发展&#xff0c;拓展开发者的思路与能力&#xff0c;挖掘边缘智能应用的创新与潜能&#xff0c;高通技术公司联…

docker Error response from daemon

问题 Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": read tcp 192.168.50.233:54354->54.198.86.24:443: read: connection reset by peer Unable to find image redis:latest locally docker: Error response from d…

数据挖掘——模型的评价

数据挖掘——模型的评价 模型的评价混淆矩阵ROC曲线如何构建ROC曲线 模型过分拟合和拟合不足减少泛化误差 模型的评价 混淆矩阵 准确率 a d a b c d \frac{ad}{abcd} abcdad​ T P T N T P T N F P F N \frac{TPTN}{TPTNFPFN} TPTNFPFNTPTN​ 其他度量&#xff1a; …

常用的数据结构API概览

List ArrayList 1、在初始化一个ArrayList的时候&#xff0c;如果我想同时set一些值 比如存放int[ ] List<int[]> list new ArrayList(Arrays.asList(new int[]{intervals[0][0],intervals[0][1]}));//或者int[] temp new int[]{intervals[0][0],intervals[0][1]}…

OceanBase到MySQL实时同步方案

概述 本方案基于OceanBase Binlog服务&#xff0c;采用数据库实时复制软件Beedup订阅捕获OceanBase数据库的Binlog事件&#xff0c;复制软件将Binlog事件还原为MySQL支持的DML或DDL&#xff0c;然后交由MySQL数据库执行。 配置Binlog任务 启用OceanBase Binlog服务&#xff…

【数据库系统概论】绪论--复习

1. 数据库的四个基本概念 数据&#xff1a;指经过处理的、可用于计算机操作的原始信息&#xff08;或者也可以理解成是——描述事务的符号&#xff0c;数字、图像、符号、音频、视频、文字、图形等都可以是数据&#xff09;。数据库&#xff1a;是长期存储在计算机内有组织、可…

Git 下载问题及解决方法

在某些网络环境下&#xff0c;可能会遇到 Git 无法下载的问题&#xff0c;通常是由于网络限制或需要通过代理访问导致的。以下是常见的解决方法&#xff0c;包括设置代理、取消代理以及其他诊断方法。 1. 设置 Git 代理 在一些网络环境下&#xff0c;可能会使用工具&#xff0…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举

本篇博客将聚焦于通过递归来实现两种经典的枚举方法&#xff1a;指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用&#xff0c;无论是在解题中&#xff0c;还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…

大模型 LangChain 开发框架-初探

大模型 LangChain 开发框架-初探 一、LangChain 概述 LangChain 是一个强大的由大型语言模型&#xff08;LLM&#xff09;驱动的应用程序开发框架。它的核心价值在于提供了标准化组件接口、高效的任务编排能力以及可观察性和评估机制。通过这些特性&#xff0c;LangChain 有效…

生成埃里克卡特曼人工智能语音听起来像他或配音视频

您是《南方公园》和迷人角色埃里克卡特曼的忠实粉丝吗&#xff1f;您是否渴望获得标志性的埃里克卡特曼 AI 语音&#xff0c;将他的动画魅力融入到您的数字内容、游戏或流媒体体验中&#xff1f;如果答案是肯定的&#xff0c;那么您来对地方了&#xff01; 在本文中&#xff0…

BLDC无感控制的驱动逻辑

如何知道转子已经到达预定位置&#xff0c;因为我们只有知道了转子到达了预定位置之后才能进行换相&#xff0c;这样电机才能顺滑的运转。转子位置检测常用的有三种方式。 方式一&#xff1a;通过过零检测&#xff0c;三相相电压与电机中性点电压进行比较。过零检测的优点在于…

【Vue教程】使用Vite快速搭建前端工程化项目 | Vue3 | Vite | Node.js

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f6a9;今天毛毛张分享的是关于如何快速&#x1f3c3;‍♂️搭建一个前端工程化的项目的环境搭建以及流程&#x1f320; 文章目录 1.前端工程化环境搭建&#…

手机租赁平台开发全攻略打造高效便捷的租赁服务系统

内容概要 手机租赁平台开发&#xff0c;简单说就是让用户能轻松租赁各类手机的高效系统。这一平台不仅帮助那些想要临时使用高端手机的人们节省了不少资金&#xff0c;还为商家开辟了新的收入渠道。随着智能手机的普及&#xff0c;很多人并不需要长期拥有一部手机&#xff0c;…

[最佳方法] 如何将视频从 Android 发送到 iPhone

概括 将大视频从 Android 发送到 iPhone 或将批量视频从 iPhone 传输到 Android 并不是一件容易的事情。也许您已经尝试了很多关于如何将视频从 Android 发送到 iPhone 15/14 的方法&#xff0c;但都没有效果。但现在&#xff0c;通过本文中的这 6 种强大方法&#xff0c;您可…

记录一下图像处理的基础知识

记录一下自己学习的图像处理的基础知识。 一、图像的文件格式以及常用的图像空间 1、文件格式 常见的图像文件格式有 jpg, png, bmp, gif &#xff08;1&#xff09;jpg&#xff1a;有损压缩算法&#xff0c;大幅减小文件大小&#xff0c;便于存储和传输&#xff0c;兼容性…