超赞的进度条控件

© 2012 Conmajia, 2011 Graham Wilson
SN: 125.2
本文为 CodeProject 2011 年 4 月号最佳 C# 文章获奖作品。本中文版翻译已获原作者 Graham Wilson 首肯。

简介

本文介绍一款有趣的进度条控件(ProgressBar)。如下演示,这款名为“超赞进度条”的控件可以直接平替传统的 WinForm 原生进度条控件。

本文提供了 2.0.0 版本的类库,包含控件库本体和一个便捷的编辑器。读者可以下载后通过该编辑器获取所需效果并生成最终代码。

可下载内容:

  1. 超赞进度条演示程序及编辑器
  2. 超赞进度条类库文件
  3. 超赞进度条源代码

超赞进度条的运行效果

超赞进度条的运行效果(动画)

本文附赠的超赞进度条编辑器(动画)

超赞进度条使用 .NET Framework 3.5,4.6.2 和 6.0 编译完成。所有的公共和私有类、方法及属性都使用标准 C# XML 文档注释进行了完整的文档记录。项目文件中附带了 .chm 和 .mshc 格式的帮助文件(英文)。有关使用该类的更多详细信息,请参阅帮助文件中的概述部分。

演示程序及编辑器文件(AmazingProgressBar2_200_Demo.zip)中包含以下文件。

  • GAW.AmazingProgressBar2.Net462.dll
    以 .NET 4.6.2 编译的库文件
  • GAW.AmazingProgressBar2.ExplorerApp.Net462.exe
    超赞进度条编辑器
  • GAW.AmazingProgressBar2.ExamplesApp.Net462.exe
    超赞进度条演示程序
  • GAW.SimpleWidgets2.Net462.dll
    以 .NET 4.6.2 编译的 SimpleWidgets2 库

背景

某日,我苦等一个漫长的计算任务,百无聊赖地看着进度条在屏幕上缓缓蠕动。我突然意识到这个标准的进度条是多么无趣(参见图 1——译者注)。在思考这个问题一段时间后,我想到了一个穿越迷宫的进度条想法。于是,超赞进度条就此诞生。

图 1. 传统进度条的运行效果

如何使用

使用超赞进度条非常简单,只需将在界面窗体上添加 AmazingProgressBar2 类的实例即可。

AmazingProgressBar2 amaze = new AmazingProgressBar2();
amaze.Location = new System.Drawing.Point(0, 0);
amaze.Size = new System.Drawing.Size(200, 50);
form.Controls.Add(amaze);

你可以直接用 AmazingProgressBar2 平替任何已有的 ProgressBar(传统进度条)。进度条填充方向和样式由 MazeStyle 属性决定,各效果如下。

  • SingleRight
  • SingleLeft
  • SingleUp
  • SingleDown
  • SplitConvergeHorizontal
  • SplitConvergeVertical
  • SplitDivergeHorizontal
  • SplitDivergeVertical

每个迷宫都应该有一条可以穿越的路线,但如果设定的 RowCount 大于 3,生成的迷宫可能会出现少量岔路。迷宫的总方向由 MazeStyle 指定,实际填充进度的时候会有转弯和回头。

迷宫的大小和复杂程度通常取决于 RowCount 参数,设置这个参数以固定迷宫中的行数。RowCount = 1 的结果是一个单行迷宫,看起来就像传统的进度条。RowCount = 2 将生成一个明显无趣的迷宫。强烈推荐使用 3 或更高的值。

迷宫中的列数是考虑到控件的大小、当前的 RowCountWallSizeBorderSize 的值,以及迷宫中所有单元格必须是正方形的规则下的最大值。

ProgressBar.Style 属性仍然可以设置。Marquee 样式按预期工作,但如果迷宫长度过长,可能不会像预期的那样快。Blocks 样式通常在视觉上不如 Continuous 那样吸引人,尽管将 Blocks 与零宽度的 WallSize 结合使用会产生有趣的效果。

以下代码段展示了如何设置 StyleMazeStyle 以及行数。

// 假设超赞进度条实例 amaze 已经初始化
amaze.Style = ProgressBarStyle.Continous;
amaze.MazeStyle = AmazingProgressBarMazeStyle.SingleLeft;
amaze.RowCount = 4;

如果控件无法生成迷宫,则控件会被填充为粉红色与黑色的波纹图案(图 2)。这通常是由于 RowCount 设置得太高或太低所导致的。

图 2. 无效迷宫

迷宫内填充的单元格可以是固定的同一颜色,也可以遵循颜色渐变。这由 ColorStyle 属性决定:

  • ForeColor:所有填充的单元格都是 ForeColor
  • GradientRows:迷宫中的每一行都是不同的颜色,沿着渐变展开,第一行是 GradientColors 中的第一种颜色,最后一行是 GradientColors 中的最后一种颜色。
  • GradientColumns:迷宫中的每一列都是不同的颜色,沿着渐变展开,第一列是 GradientColors 中的第一种颜色,最后一列是 GradientColors 中的最后一种颜色。
  • GradientFlow:迷宫中的每个单元格都是不同的颜色,沿着渐变展开,第一个单元格是 GradientColors 中的第一种颜色,最后一个单元格是 GradientColors 中的最后一种颜色。

所有未填充的单元格始终是 BackColor

如果 WallSize 大于零,则迷宫墙壁可见。墙壁只能是 WallColor 属性指示的一个固定颜色。

迷宫边框可以是一个固定颜色,或者是从那个固定颜色到默认控件颜色的渐变。迷宫边框也可以有圆角。

以下代码段展示了如何设置各种颜色属性。

// 假设超赞进度条实例 amaze 已经初始化
amaze.Gradient = GradientType.Rows;
amaze.ForeColor = Color.LightBlue;
amaze.BorderSize = 2;
amaze.BorderColor = Color.LightGreen;
amaze.BorderGradient = false;
amaze.BorderRoundCorners = true;
amaze.BackColor = Color.White;

如何生成迷宫

有许多方法可以生成迷宫。这个控件需要一种算法,能够快速且内存开销有限地生成在特定方向上流动、分支最少的迷宫。

SimpleMap 类就是为这个目的而设。它是一个静态类,用于生成仅在指定方向上有一条路线的迷宫。大多数情况下它工作得很好,但对于 RowCount 大于 3 的值,它偶尔会错过一些单元格,导致迷宫中出现分支。

以下是生成单路径迷宫的指令。所使用的方向——向前、向后和侧向——取决于方向参数。例如,如果方向是 Dir.E,那么向前就是东,向后就是西,侧向就是北或南。

从最后方的角落单元格之一开始。反复遵循以下规则(按顺序)来确定下一个单元格。当所有方向都被阻挡时停止。

  1. 如果只有一个方向可能,就往那个方向走。
  2. 如果可以向后走,就走那个方向。
  3. 如果在侧向方向只有一个空单元格,就往那个方向走。
  4. 如果在两个侧向方向都有不止一个空单元格,随机选择其中一个方向。
  5. 从可用的方向中随机选择一个方向;但你只能向前走,如果:
    • 在侧边边缘,
    • 距最前端超过两步,
    • 最后方填充的列不超过三步向后。

规则 2 和 5 的目的是确保迷宫在回绕前不会走得太远。

一旦到达所有方向都被阻挡的单元格,上述规则就不再适用。此时,对于每个未使用的单元格:随机选择一个方向并使该方向可通行。这将导致迷宫中出现分支,但它确保没有跳过或未使用的单元格。

许可

本文及其附带文件、代码以 CPOL 许可 发布。

© 2012 Conmajia, 2011 Graham Wilson

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

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

相关文章

毫米波雷达:从 3D 走向 4D

1 毫米波雷达已广泛应用于汽车 ADAS 系统 汽车智能驾驶需要感知层、决策层、执行层三大核心系统的高效配合,其中感知层通过传感器探知周围的环境。汽车智能驾驶感知层将真实世界的视觉、物理、事件等信息转变成数字信号,为车辆了解周边环境、制定驾驶操…

基于OpenAI的Whisper构建的高效语音识别模型:faster-whisper

1 faster-whisper介绍 faster-whisper是基于OpenAI的Whisper模型的高效实现,它利用CTranslate2,一个专为Transformer模型设计的快速推理引擎。这种实现不仅提高了语音识别的速度,还优化了内存使用效率。faster-whisper的核心优势在于其能够在…

DCDC--电感的选择和影响

1、感值L的影响 1.1、纹波Ripple的影响:感值越大,纹波越小 1.2、负载瞬态响应Load Transient的影响:感值越大,负载瞬态响应越差 2、直流电阻DCR的影响 2.1、效率Efficiency的影响 相同型号,感值越大,DC…

浅学Vue3

安装 vue项目 npm init vuelatest 回车装包 npm install 路由 安装 Router npm install vue-router4 -S项目根目录新建 router --> index.js vue2中 index.jsimport Vue from vue; import VueRouter from vue-router; import Home from ../views/Home.vue;Vue.use(V…

2023年度总结:技术旅程的杨帆远航⛵

文章目录 职业规划与心灵成长 ❤️‍🔥我的最大收获与成长 💪新年Flag 🚩我的技术发展规划 ⌛对技术行业的深度思考 🤔祝愿 🌇 2023 年对我来说是一个充实而令人难以忘怀的一年。这一年,我在CSDN上发表了 1…

Arduino驱动VL6180X光学测距传感器(OLED显示)

Arduino驱动VL6180X光学测距传感器(OLED显示) 简介原理模块参数接线图代码结果 简介 VL6108X三合一光电模块,芯片内集成了IR VSEL(vertical-cavity surface-emitting laser)红外垂直腔面发射激光器光源、接近传感器、环境光传感器&#xff0…

Windows搭建RTMP视频流服务(Nginx服务器版)

文章目录 引言1、安装FFmpeg2、安装Nginx服务器3、实现本地视频推流服务4、使用VLC或PotPlayer可视化播放器播放视频5、RTSP / RTMP系列文章 引言 RTSP和RTMP视频流的区别 RTSP (Real-Time Streaming Protocol)实时流媒体协议。 RTSP定义流格式&#xff…

2023总结与展望--Empirefree

今年一篇博客都没写过了,好像完全在忙在工作和生活上面了,珍惜自我,保持热情,2024对我好点 文章目录 🔥1. 年终总结1.1.学习工作计划1.2. 生活计划1.3 个人总结 🔥2. 未来展望 🔥1. 年终总结 1…

MySQL函数、AVG | MIN | MAX | COUNT | SUM、慢查询

MySQL函数、慢查询 1、函数1.日期函数2.两个日期的时间差3.查询距离时间的间隔时间4.常用的字符串函数5.常用的数学函数6.常用的聚合函数 2、慢查询1.什么是慢查询? 从需求出发,在数据的操作过程中经常会有以下的问题;求和、最大值、最小值、…

未来十年,量子计算将改变物流行业

近年来,供应链和物流行业面临的挑战越来越多,从劳动力短缺到无法预测的天气以及供需变化,都使物流行业变得更加复杂。 因此,现在急需一种不同的方法来解决这些挑战,优化单个功能或整个业务的传统方法已无法应对这些困…

Mysql使用Mybatis进行时间操作

MySQL中支持以下日期时间类型: DATE:存储年月日(例如:2023-04-05)。范围从"1000-01-01"到"9999-12-31" TIME:存储时分秒(例如:11:22:22)。范围从&q…

Authing 分级管理员重磅上线,实现权限超细粒度分级管

数字化时代企业的现代化建设日益重要,身份权限管理系统的数字化变革已经成为企业数字化转型的核心要素之一,同时也对身份权限管理的“最后一公里”提出了更高的要求。管理员作为关键人员,往往掌握整个企业的数据核心访问权限,需要…

Seata AT TM->RC->RM一次完整的交互过程

原理 TM两阶段: 阶段1:TM向TC申请全局事务,netty客户端发起了一次记录xid的请求 阶段2:TC协调之后,决定执行RM是否提交或者回滚。 spring公共组件部分 1、SeataAutoConfiguration类加载 利用springboot自动装配机…

js实现前端下载图片和文件资料

说明:下载图片和文档资料是两种不同的方式,所以需要先判断下载的是图片还是word,excel等文件资料 目录 1.文件资料下载: 2.图片资源下载 1.文件资料下载: window.location.href 文件路径; handleClick(item) {let…

如何使用Spoofy检测目标域名是否存在欺骗攻击风险

关于Spoofy Spoofy是一款功能强大的域名安全检测工具,在该工具的帮助下,广大研究人员可以轻松检测单个目标域名或域名列表中的域名是否存在遭受欺诈攻击的风险。 该工具基于纯Python开发,可以根据SPF和DMARC记录来检测和判断目标域名是否可…

C++ 类和对象 (上)

类的引入: 由于C语言是面向过程的编程语言,我们在完成一件事的时候通常习惯将一件事拆分成一个一个小过程来实现,而到了C就习惯将一件事分成不同的模块,交给不同的对象来处理,每一个对象中承载着数据类型和函数。 &am…

Jackson进行Json反序列化对于一个小写字母开头后跟大写字母无法识别反序列成功问题

问题描述 json数据:{“pTargetId”:“123”} javaBean: Datapublic static class Test {private String pTargetId;}运行下面代码: public static void main(String[] args) throws JsonProcessingException {String json "{\"pT…

We are a team - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 总共有 n 个人在机房&#xff0c;每个人有一个标号 (1<标号<n) &#xff0c;他们分成了多个团队&#xff0c;需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中&#xff0c;具体的: 消息构成为 a b …

智慧启航:机场管理系统的革新与飞机航天展馆的视觉盛宴

随着科技的飞速发展&#xff0c;我们的生活方式正在不断地被改变和提升。而在航空领域&#xff0c;这种变化则更加明显。从机场的智慧管理系统大屏&#xff0c;到飞机航天展馆的三维可视化&#xff0c;再到飞机涡轮发动机的3D模型&#xff0c;科技的力量正在带我们进入一个前所…

ArkUI按钮组件深入学习:通过点击按钮实现图片大小调整效果

文章目录 前言Button组件控制 Button 样式实现点击按钮改变图片大小文章总结技术回顾前言 在前面几节课中,我们已经学习了 ArkUI 提供的一些常见组件,通过一个小案例实现了 image text 和 text input 组件的使用。我们成功地让用户通过输入来改变图片的宽度,从而实现了一个…