神奇的 ProgressBar 控件






4.96/5 (223投票s)
一个进度条,它通过一个简单的迷宫来显示进度。
- 下载 AmazingProgressBar2_200_Demo - 131.0 KB
- 下载 AmazingProgressBar2_200_Library - 4.6 MB
- 下载 AmazingProgressBar2_200_Source - 394.6 KB
引言
这是库的 2.0.0 版本。与早期(1.x)版本存在不兼容。为避免冲突,库已重命名为 AmazingProgressBar2。有关更多详细信息,请参阅“历史”部分。
AmazingProgressBar2
控件是 .NET Windows Forms ProgressBar
控件的即插即用替代品,它通过一个简单的迷宫来显示进度。
![]() |
AmazingProgressBar2
控件使用 .NET Framework 3.5、.NET Framework 4.6.2 和 .NET 6.0 进行编译。
所有 public
和 protected
类、方法和属性都使用标准的 C# XML 文档注释进行了完全记录。该项目包含 .chm 和 .mshc 格式的帮助文件。有关使用该类的详细信息,请参阅帮助文件中的“概述”部分。
AmazingProgressBar2_200_Demo 包含以下文件
GAW.AmazingProgressBar2.Net462.dll | 为 .NET Framework 4.6.2 编译的库。 | ||
GAW.AmazingProgressBar2.ExplorerApp.Net462.exe | 用于试验控件各种属性的示例应用程序。 | ||
GAW.AmazingProgressBar2.ExamplesApp.Net462.exe | 显示各种控件示例的示例应用程序。 | ||
GAW.SimpleWidgets2.Net462.dll | 为 .NET Framework 4.6.2 编译的 SimpleWidgets2 库。 |
AmazingProgressBar2_200_Library 包含以下文件
GAW.AmazingProgressBar2.Net35.dll | 为 .NET Framework 3.5 编译的库。 | ||
GAW.AmazingProgressBar2.Net462.dll | 为 .NET Framework 4.6.2 编译的库。 | ||
GAW.AmazingProgressBar2.Net60 (.dll,.deps.json) | 为 .NET 6.0 编译的库。 | ||
GAW.AmazingProgressBar2.ExplorerApp.Net35.exe | 为 .NET Framework 3.5 编译的用于试验控件各种属性的示例应用程序。 | ||
GAW.AmazingProgressBar2.ExplorerApp.Net462.exe | 为 .NET Framework 4.6.2 编译的用于试验控件各种属性的示例应用程序。 | ||
GAW.AmazingProgressBar2.ExplorerApp.Net60 (.exe,.dll,.deps.json,.runtimeconfig.json) | 为 .NET 6.0 编译的用于试验控件各种属性的示例应用程序。 | ||
GAW_AmazingProgressBar2.chm | 帮助文件(HTML Help 格式)。 | ||
GAW_AmazingProgressBar2.msha | 帮助文件(MS Help Viewer 格式)。 | ||
GAW_AmazingProgressBar2.mshc | 帮助文件(MS Help Viewer 格式)。 | ||
GAW.SimpleWidgets2.Net35.dll | 为 .NET Framework 3.5 编译的 SimpleWidgets2 库。 | ||
GAW.SimpleWidgets2.Net462.dll | 为 .NET Framework 4.6.2 编译的 SimpleWidgets2 库。 | ||
GAW.SimpleWidgets2.Net60 (.dll,.deps.json) | 为 .NET 6.0 编译的 SimpleWidgets2 库。 |
AmazingProgressBar2_200_Source 包含以上所有程序(除了 GAW.SimpleWidgets2
)的源代码,以及构建帮助文件所需的必要文件。
背景
有一天,在等待一项耗时的计算任务完成时,我意识到标准的进度条是多么无趣。一定有比一条缓慢划过屏幕的彩色条更吸引人的东西。思考了一会儿问题后,我产生了进度条穿过一个简单迷宫的想法。神奇进度条控件就此诞生。
AmazingProgressBar2
纯粹是视觉上的享受。它不会让任务运行得更快,但可能会让等待不那么乏味!
Using the Code
要使用 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,可能会发生少量的分支。迷宫方向是指总体方向,尽管总会有曲折和一些回溯。
迷宫的大小和复杂性通常取决于 RowCount
参数。设置此参数以固定迷宫的行数。值为 1 会导致迷宫看起来就像标准的进度条。值为 2 会导致迷宫非常不有趣。强烈推荐值为 3 或更高。
迷宫的列数是根据控件的大小、RowCount
、WallSize
和 BorderSize
的当前值以及所有迷宫单元格都必须是正方形的规则所能给出的最大值。
仍然可以设置 ProgressBar.Style
属性。Marquee
样式如预期那样工作,但如果迷宫长度过长,可能无法如预期般快速工作。Blocks
样式通常不如 Continuous
样式在视觉上吸引人,尽管将 Blocks
与零 WallSize
结合使用会产生有趣的效果。
以下代码段展示了如何设置 Style
、MazeStyle
和行数。
// Assumes "AmazingProgressBar2 amaze" already declared and initialized
amaze.Style = ProgressBarStyle.Continous;
amaze.MazeStyle = AmazingProgressBarMazeStyle.SingleLeft;
amaze.RowCount = 4;
如果控件无法生成迷宫,则控件会填充粉红色 - 在黑色的涟漪图案中。这通常是由于 RowCount
过高或过低造成的。
![]() |
迷宫内的填充单元格可以全部是相同的固定颜色,或者遵循颜色渐变。这由 ColorStyle
属性决定
ForeColor | 所有填充单元格都是 ForeColor 。 |
GradientRows | 迷宫的每一行都是不同的颜色,跨越渐变,第一行是 GradientColors 中的第一种颜色,最后一行是 GradientColors 中的最后一种颜色。 |
GradientColumns | 迷宫的每一列都是不同的颜色,跨越渐变,第一列是 GradientColors 中的第一种颜色,最后一列是 GradientColors 中的最后一种颜色。 |
GradientFlow | 迷宫的每个单元格都是不同的颜色,跨越渐变,第一个单元格是 GradientColors 中的第一种颜色,最后一个单元格是 GradientColors 中的最后一种颜色。 |
所有未填充的单元格始终是 BackColor
。
当 WallSize
大于零时,迷宫墙是可见的。墙只能是一种固定的颜色,如 WallColor
属性所示。
迷宫边框可以是固定的一种颜色,也可以是从固定颜色到默认控件颜色的渐变。迷宫边框也可以有圆角。
以下代码段展示了如何设置各种颜色属性。
// Assumes "AmazingProgressBar2 amaze" already declared and initialized
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 时,它偶尔会遗漏一些单元格,导致迷宫出现分支。
以下是生成单路径迷宫的说明。所使用的方向 - 前进、后退和侧向 - 取决于 direction
参数。例如,如果 direction
是 Dir.E
,则前进是东,后退是西,侧向是北或南。
从最靠后的角落单元格之一开始。重复(按顺序)遵循以下规则来确定下一个单元格。当所有方向都被阻塞时停止。
- 如果只有一个方向可能,则向该方向移动。
- 如果可以后退,则向后退方向移动。
- 如果侧向只有一个空单元格,则向该方向移动。
- 如果侧向有两个或更多个空单元格,则随机选择其中一个方向。
- 从可用方向中随机选择一个方向;但只有在以下情况下才允许前进:
- 位于侧边边缘,并且
- 距离最靠前的端点超过两步,并且
- 最靠后的已填充列距离后方不超过三步。
规则 #2 和 #5 的目的是确保迷宫在回溯之前不会前进太远。
一旦到达一个所有方向都被阻塞的单元格,上述规则就不再适用。此时,对于每个未使用的单元格:随机选择一个方向并使该方向可通行。这将导致迷宫出现分支,但可以确保没有跳过或未使用的单元格。
历史
- 2022 年 12 月 30 日 - 版本 2.0.0
- 删除了
StartColor
和EndColor
属性;添加了GradientColors
属性。 - 将
AmazingProgressBar.MazeStyleType
枚举重命名为AmazingProgressBarMazeStyle
。 - 将
AmazingProgressBar.GradientType
枚举重命名为AmazingProgressBarColorStyle
,并将Gradient
属性重命名为ColorStyle
。 - 将根命名空间从
GAW
更改为GAW.Forms
。 - 更改项目以使用
SimpleWidgets2
库。 - 更改项目,以便库和应用程序使用 Visual Studio 2022 针对 .NET Framework 3.5、.NET Framework 4.6.2 和 .NET 6.0 进行编译。
- 更改帮助文件以与 Sandcastle Help File Builder 2021.11.7.0 一起使用。
- 更改库和类名称为
AmazingProgressBar2
,以避免与早期版本的库发生冲突。
- 删除了
- 2014 年 9 月 7 日 - 版本 1.1.1
- 将 .csproj 文件转换为 Visual Studio 2013 格式。
- 将帮助文件转换为与 SandCastle Help File Builder 2014.5.31.0 一起使用。
- 2011 年 5 月 3 日 - 版本 1.1
- 添加了
Split...
迷宫样式。 - 添加了
AmazingProgressBar.BorderRoundCorners
成员。
- 添加了
- 2011 年 4 月 17 日 - 首次发布