C# 实现draw一个简单的温度计

运行结果

概述:

代码分析

该控件主要包含以下几个部分:

  1. 属性定义

    • MinValue:最低温度值。

    • MaxValue:最高温度值。

    • CurrentValue:当前温度值。

  2. 构造函数

    • 设置了一些控件样式来提升绘制效果,如 DoubleBuffer 以及 ResizeRedraw 等。

    • 设定了控件的默认宽度和高度,并设置背景色和内边距。

  3. 绘制逻辑 (在 OnPaint 方法中):

    • 使用 Graphics 类的方法来绘制控件的各个部分。

    • 先绘制背景,然后绘制温度计的边框。

    • 根据 MinValueMaxValue 来绘制刻度线和刻度数字。

    • 最后根据 CurrentValue 绘制红色表示当前温度的水银柱。

这段代码创建了一个温度计控件,可以设置和显示温度值范围。通过重写 OnPaint 方法,绘制出控件的背景、边框、刻度线和水银柱。用户可以通过设置 MinValue, MaxValueCurrentValue 属性来改变温度计的显示。

调用代码:

cs 复制代码
        private void button1_Click(object sender, EventArgs e)
        {
            temperatureGauge1.CurrentValue += 10;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            temperatureGauge1.CurrentValue -= 10;
        }

控件代码:

cs 复制代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{    
    public class TemperatureGauge : Control
    {
        private int minValue = 0;
        private int maxValue = 100;
        private int currentValue = 50;

        public int MinValue
        {
            get { return minValue; }
            set { minValue = value; Invalidate(); }
        }

        public int MaxValue
        {
            get { return maxValue; }
            set { maxValue = value; Invalidate(); }
        }

        public int CurrentValue
        {
            get { return currentValue; }
            set
            {
                if (value < minValue)
                    currentValue = minValue;
                else if (value > maxValue)
                    currentValue = maxValue;
                else
                    currentValue = value;

                Invalidate();
            }
        }

        public TemperatureGauge()
        {
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.DoubleBuffer, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.UserPaint, true);

            Width = 60;  // 控制宽度以控制温度计的高度
            Height = 300; // 控制高度以控制温度计的宽度
            BackColor = Color.WhiteSmoke;
            Padding = new Padding(2, 20, 2, 20);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            // 绘制背景
            g.FillRectangle(Brushes.White, Padding.Left, Padding.Top, Width - Padding.Horizontal, Height - Padding.Vertical);

            // 绘制边框
            g.DrawRectangle(Pens.AliceBlue, Padding.Left, Padding.Top, Width - Padding.Horizontal - 1, Height - Padding.Vertical - 1);

            // 绘制刻度线
            for (int i = minValue; i <= maxValue; i += 10)
            {
                float yPos = (float)(maxValue - i) / (maxValue - minValue) * (Height - Padding.Vertical) + Padding.Top;
                g.DrawLine(Pens.Black, Padding.Left + 10, yPos, Padding.Left + 20, yPos);
                g.DrawString(i.ToString(), Font, Brushes.Black, Padding.Left + 25, yPos - 10);
            }

            // 绘制水银柱
            float indicatorY = (float)(maxValue - currentValue) / (maxValue - minValue) * (Height - Padding.Vertical) + Padding.Top;
            float mercuryHeight = (Height - Padding.Vertical) - (indicatorY - Padding.Top);
            g.FillRectangle(Brushes.Red, Padding.Left + 10, indicatorY, 10, mercuryHeight);
        }
    }
}

完整代码下载

【免费】C#实现draw一个简单的温度计资源-CSDN文库https://download.csdn.net/download/anlog/89465905

参考链接

C# 实现draw一个简单的温度计 (qq.com)https://mp.weixin.qq.com/s?__biz=MzUxMjI3OTQzMQ==&mid=2247488637&idx=2&sn=ded3194de1158128f29b2519e371ae18&chksm=f9678295ce100b830313ad32006d258269a4768e135bf01ac68400ba7e46ccdad05a7c690995&mpshare=1&scene=1&srcid=062036jsNqbQXDC5RaQVT8wm&sharer_shareinfo=a5133170b492dcddf1a0f88969451270&sharer_shareinfo_first=0c72e181d0952a85a3801b064fe2fe1e#rd

特此记录

anlog

2024年6月21日

相关推荐
----云烟----2 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024062 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic2 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it2 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
九鼎科技-Leo3 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
转世成为计算机大神3 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海3 小时前
scala String
大数据·开发语言·scala
qq_327342733 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍3 小时前
Scala的Array数组
开发语言·后端·scala