65.9K
CodeProject 正在变化。 阅读更多。
Home

神奇的 ProgressBar 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (223投票s)

2011年4月17日

CPOL

8分钟阅读

viewsIcon

524021

downloadIcon

18023

一个进度条,它通过一个简单的迷宫来显示进度。

引言

这是库的 2.0.0 版本。与早期(1.x)版本存在不兼容。为避免冲突,库已重命名为 AmazingProgressBar2。有关更多详细信息,请参阅“历史”部分。

AmazingProgressBar2 控件是 .NET Windows Forms ProgressBar 控件的即插即用替代品,它通过一个简单的迷宫来显示进度。

AmazingProgressBar2 控件使用 .NET Framework 3.5、.NET Framework 4.6.2 和 .NET 6.0 进行编译。

所有 publicprotected 类、方法和属性都使用标准的 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 或更高。

迷宫的列数是根据控件的大小、RowCountWallSizeBorderSize 的当前值以及所有迷宫单元格都必须是正方形的规则所能给出的最大值。

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

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

// 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 参数。例如,如果 directionDir.E,则前进是东,后退是西,侧向是北或南。

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

  1. 如果只有一个方向可能,则向该方向移动。
  2. 如果可以后退,则向后退方向移动。
  3. 如果侧向只有一个空单元格,则向该方向移动。
  4. 如果侧向有两个或更多个空单元格,则随机选择其中一个方向。
  5. 从可用方向中随机选择一个方向;但只有在以下情况下才允许前进:
    1. 位于侧边边缘,并且
    2. 距离最靠前的端点超过两步,并且
    3. 最靠后的已填充列距离后方不超过三步。

规则 #2 和 #5 的目的是确保迷宫在回溯之前不会前进太远。

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

历史

  • 2022 年 12 月 30 日 - 版本 2.0.0
    • 删除了 StartColorEndColor 属性;添加了 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 日 - 首次发布
© . All rights reserved.