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日

相关推荐
明月看潮生13 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
南宫理的日知录24 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘40 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up43 分钟前
C语言心型代码解析
c语言·开发语言
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin