Winform自定义控件与案例 - 构建炫酷的自定义环形进度条控件

news2025/2/13 7:05:05

文章目录

  • 1、控件效果
  • 2、案例实现
    • 1、代码实现
    • 2、代码解释
    • 3、使用示例
  • 4、总结


1、控件效果

在这里插入图片描述

2、案例实现

1、代码实现

代码如下(示例):

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WW_Controls
{
    public partial class CircularProgressBar : UserControl
    {
        public CircularProgressBar()
        {
            InitializeComponent();
            InitializeControlStyles();
        }

        private void InitializeControlStyles()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint |
                          ControlStyles.DoubleBuffer |
                          ControlStyles.ResizeRedraw |
                          ControlStyles.Selectable |
                          ControlStyles.SupportsTransparentBackColor |
                          ControlStyles.UserPaint, true);
        }

        // 自定义属性
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("默认背景色")]
        public Color BaseColor { get; set; } = Color.FromArgb(93, 107, 15);

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("中心圆颜色")]
        public Color InnerColor { get; set; } = Color.White;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("标题文本内容")]
        public string TitleName { get; set; } = "标题文本";

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("标题文本字体")]
        public Font TitleFont { get; set; } = new Font("微软雅黑", 10.5f);

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("数值文本字体")]
        public Font ValueTextFont { get; set; } = new Font("微软雅黑", 10.5f);

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("圆环宽度")]
        public int GapWidth { get; set; } = 25;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("渐变圆环起始颜色")]
        public Color GradientStartColor { get; set; } = Color.Blue;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("渐变圆环末端颜色")]
        public Color GradientEndColor { get; set; } = Color.Red;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("最大值")]
        public float MaxValue { get; set; } = 1000.0f;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("实际值")]
        public float ActualValue { get; set; } = 600.0f;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("显示模式")]
        public bool IsPercentShow { get; set; } = true;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("单位")]
        public string Unit { get; set; } = string.Empty;

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics graphics = e.Graphics;
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

            Rectangle rectangle = new Rectangle(1, 1, this.Width - 2, this.Height - 2);
            graphics.FillEllipse(new SolidBrush(BaseColor), rectangle);

            LinearGradientBrush brush = new LinearGradientBrush(rectangle, GradientStartColor, GradientEndColor, 150.0f);
            float angle = (ActualValue / MaxValue) * 360;
            graphics.FillPie(brush, rectangle, -90, angle);

            graphics.FillEllipse(new SolidBrush(InnerColor), new Rectangle(1 + GapWidth, 1 + GapWidth, this.Width - 2 * (1 + GapWidth), this.Height - 2 * (1 + GapWidth)));

            StringFormat stringFormat = new StringFormat { Alignment = StringAlignment.Center };

            Rectangle titleRect = new Rectangle(0, 0, this.Width, this.Height / 2);
            stringFormat.LineAlignment = StringAlignment.Far;
            graphics.DrawString(TitleName, TitleFont, new SolidBrush(ForeColor), titleRect, stringFormat);

            Rectangle valueRect = new Rectangle(0, this.Height / 2, this.Width, this.Height / 2);
            stringFormat.LineAlignment = StringAlignment.Near;
            string showValue = IsPercentShow ? (MaxValue <= 0 ? "0.0%" : $"{(int)(ActualValue / MaxValue * 100)}%") : $"{ActualValue}{Unit}";
            graphics.DrawString(showValue, ValueTextFont, new SolidBrush(ForeColor), valueRect, stringFormat);
        }
    }
}

2、代码解释

  • 初始化控件样式: 通过设置各种ControlStyles来优化控件的绘制性能和外观。
  • 自定义属性: 通过定义一系列可公开访问的属性,允许用户在设计时或运行时轻松修改控件的行为和外观。
  • 绘图逻辑: 利用Graphics对象提供的方法绘制基础圆、渐变扇形、内圆以及文本。

3、使用示例

将此控件拖放到你的窗体上,并在属性窗口中调整各个属性,即可看到不同的视觉效果。例如,你可以改变GradientStartColor和GradientEndColor来尝试不同的渐变效果。

4、总结

通过本文的介绍,你应该已经掌握了如何创建一个带有渐变效果的环形进度条控件。这不仅可以提高你的编程技能,还能为你的应用程序增添独特的视觉体验。希望这篇文章对你有所帮助!如果你有任何问题或建议,请随时留言讨论!让我们共同进步,创造更多精彩的UI组件吧!

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

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

相关文章

【SpringBoot苍穹外卖】debugDay03.5

1、AOP面向切面编程 1. Target(ElementType.METHOD) 作用&#xff1a;指定自定义注解可以应用的目标范围。 参数&#xff1a;ElementType 是一个枚举类&#xff0c;定义了注解可以应用的目标类型。 ElementType.METHOD 表示该注解只能用于方法上。 其他常见的 ElementType 值…

flink实时集成利器 - apache seatunnel - 核心架构详解

SeaTunnel&#xff08;原名 Waterdrop&#xff09;是一个分布式、高性能、易扩展的数据集成平台&#xff0c;专注于大数据领域的数据同步、数据迁移和数据转换。它支持多种数据源和数据目标&#xff0c;并可以与 Apache Flink、Spark 等计算引擎集成。以下是 SeaTunnel 的核心架…

视频理解新篇章:Mamba模型的探索与应用

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…

分形几何表明数学一直存在有首、末的无穷序列

分形几何表明数学一直存在有首、末的无穷序列。一有穷长直线段S可变为锯齿状图形G而由无穷多无穷短直线段连接而成。G和S一样有左、右两个端点。

Python接口自动化测试—接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…

C++ 实践扩展(Qt Creator 联动 Visual Studio 2022)

​ 这里我们将在 VS 上实现 QT 编程&#xff0c;实现如下&#xff1a; 一、Vs 2022 配置&#xff08;若已安装&#xff0c;可直接跳过&#xff09; 点击链接&#xff1a;​​​​​Visual Studio 2022 我们先去 Vs 官网下载&#xff0c;如下&#xff1a; 等待程序安装完成之…

Java中性能瓶颈的定位与调优方法

Java中性能瓶颈的定位与调优方法 Java作为一种高效、跨平台的编程语言&#xff0c;广泛应用于企业级应用、服务器端开发、分布式系统等领域。然而&#xff0c;在面对大量并发、高负载的生产环境时&#xff0c;Java应用的性能瓶颈问题往往会暴露出来。如何定位并优化这些性能瓶…

openbmc sdbusplus接口使用(持续更新...)

1.说明 本节介绍如何使用sdbusplus&#xff0c;用来对应不同的场景。 可以参考之前的文章: https://blog.csdn.net/wit_yuan/article/details/145192471 建议阅读本篇文章一定要仔细阅读sd-bus specification 2.说明 2.1 简单server服务注册 本节参考: https://gitee.com…

2.12寒假作业

web&#xff1a;[HDCTF 2023]Welcome To HDCTF 2023 可以直接玩出来 但是这边还是看一下怎么解吧&#xff0c;看一下js代码&#xff0c;在js.game里面找到一个类似brainfuck加密的字符串 解密可以得到答案&#xff0c;但是后面我又去了解了一下let函数let命令、let命令 let命…

GitHub项目推荐--适合练手的13个C++开源项目

1 C 那些事 这是一个适合初学者从入门到进阶的仓库&#xff0c;解决了面试者与学习者想要深入 C及如何入坑 C的问题。 除此之外&#xff0c;本仓库拓展了更加深入的源码分析&#xff0c;多线程并发等的知识&#xff0c;是一个比较全面的 C 学习从入门到进阶提升的仓库。 项目…

【2025 Nature】AI 生成材料算法 MatterGen 文章要点

文章目录 1. MatterGen 框架2. 评价基础模型生成能力的指标3. MatterGen 基础生成能力表现4. MatterGen 定向生成能力表现i. 指定晶体化学式ii. 指定标量性质1. 每个性质微调一次。2. 两个性质联合微调 5. 实验合成6. 模型细节 这篇文档简单介绍 MatterGen 论文亮点。 标题&…

时间序列分析(三)——白噪声检验

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 一、相关知识点 白噪声的定义&#xff1a;白噪声序列是一种在统计学和信号处理中常见的随机过程&#xff0c;由一系列相互独立、具有相同…

[前端] axios网络请求二次封装

一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用&#xff0c;提高可维护性。 —这个有两个方案&#xff1a;一个是二次封装一个是实例化。&#xff08;设置一些公共的参数&#xff0c;然后进行请求&#xff09; 为什么可以解决代码的复用&#xff1a; 这是…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】CSS样式解析:行内、内部与外部样式的区别与优先级分析

简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;会议将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次会议将探讨前沿技术&#xff0c;…

麒麟信安系统隔核后iperf网络测试影响说明

1、背景介绍 采用麒麟信安系统&#xff0c;在飞腾平台&#xff08;X86平台类似&#xff09;上进行了系统核隔离&#xff0c;修改了grub.cfg配置文件中的启动项增加isolcpus2-63 操作&#xff0c;隔核后发现40G网络iperf测试存在影响。 测试命令 taskset -c 16-23 iperf -s -…

WPF进阶 | WPF 资源管理与本地化:多语言支持与资源复用

WPF进阶 | WPF 资源管理与本地化&#xff1a;多语言支持与资源复用 前言一、WPF 资源管理基础1.1 什么是 WPF 资源1.2 资源的定义与存储位置1.3 资源的引用方式 二、资源字典的深入应用2.1 创建资源字典2.2 在应用程序中合并资源字典2.3 资源字典的层级结构与合并顺序 三、WPF …

数据结构与算法-动态规划-区间dp(石子合并,环形石子合并,凸多边形的划分,加分二叉树,棋盘分割)

概念 区间动态规划&#xff08;Interval Dynamic Programming&#xff09;是动态规划的一个分支&#xff0c;它在处理一些与区间相关的最优解问题上非常有效。以下从基本概念、解题步骤、经典例题、优缺点等方面为你详细介绍&#xff1a; 基本概念&#xff1a;区间 DP 的核心…

32单片机学习记录4之串口通信

32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式&#xff0c;复用模式&#xff0c;模拟模式三种&#xff0c;加上输入输出就是有6中对应的模式。 我学习了通用模式&#xff0c;会使用GPIO口使用一些简单外设&#xff0c;如LED&#xff0c;独立按键&#xff0c;红外…

开源、免费项目管理工具比较:2025最新整理30款

好用的开源、免费版项目管理系统有&#xff1a;1.Redmine&#xff1b;2. Taiga&#xff1b;3. OpenProject&#xff1b; 4.ProjectLibre&#xff1b; 5.GanttProject&#xff1b; 6.Tuleap&#xff1b; 7.Trac&#xff1b;8. Phabricator&#xff1b; 9.Notion&#xff1b; 10.…

Android10 音频参数导出合并

A10 设备录音时底噪过大&#xff0c;让音频同事校准了下&#xff0c;然后把校准好的参数需要导出来&#xff0c;集成到项目中&#xff0c;然后出包&#xff0c;导出方式在此记录 设备安装debug系统版本调试好后&#xff0c; adb root adb remount adb shell 进入设备目录 导…