超赞的进度条控件

© 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 系统 汽车智能驾驶需要感知层、决策层、执行层三大核心系统的高效配合,其中感知层通过传感器探知周围的环境。汽车智能驾驶感知层将真实世界的视觉、物理、事件等信息转变成数字信号,为车辆了解周边环境、制定驾驶操…

头歌:Pandas分组聚合与透视表的创建

第1关 Pandas分组聚合 import pandas as pd import numpy as np# 返回最大值与最小值的和 def sub(df):########## Begin #########resultdf.max()-df.mean()########## End ######### def jicha(arr):resultarr.max()-arr.min()return result # 得到目标DataFrame def main()…

React Hooks usestate源码示例

React 的 useState 是一个内置的 Hook,它让你在 React 函数组件中添加 state。在 React 中,Fiber 是一个用于协调和调度工作的数据结构。React Fiber 是 React 的核心算法,也被称为 Reconciliation algorithm(协调算法&#xff09…

服务器通常不使用图形化界面的原因

目录 资源利用效率 稳定性和安全性 远程管理和自动化 例外情况 资源利用效率 图形化界面需要大量的系统资源,包括内存和处理器。服务器的主要任务是处理请求、提供服务和保证稳定性。因此,优化资源使用是关键,避免图形化界面对系统性能的…

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

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

C++三剑客之std::variant(一)

1简介 C17的三剑客分别是std::optional, std::any, std::vairant。今天主要讲std::variant。std::variant的定义如下&#xff1a; template< class... Types > class variant; 类模板 std::variant 表示一个类型安全的联合体&#xff08;以下称“变化体”&#xff09;…

DCDC--电感的选择和影响

1、感值L的影响 1.1、纹波Ripple的影响&#xff1a;感值越大&#xff0c;纹波越小 1.2、负载瞬态响应Load Transient的影响&#xff1a;感值越大&#xff0c;负载瞬态响应越差 2、直流电阻DCR的影响 2.1、效率Efficiency的影响 相同型号&#xff0c;感值越大&#xff0c;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年度总结:技术旅程的杨帆远航⛵

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

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

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

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

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

2023总结与展望--Empirefree

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

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

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

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

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

Linux C 中 multiple definition of ‘xxx‘

在多文件的项目中&#xff0c;我们可以发现有时会出现multiple definition of ‘xxx‘的问题。这个问题一般有以下表现和处理。 原因 &#xff08;1&#xff09;变量或者函数在某一个头文件中定义&#xff08;不是声明&#xff09;&#xff0c;而这个头文件被多个源文件包含&a…

react中package.json中版本号的规则

react中package.json中版本号的规则 ^&#xff1a;只会执行不更改左边非零数字的更新 2.&#xff1a;如果写入的是0.13.0&#xff0c;则当运行npm update时i&#xff0c;会更新到补丁版本 3.>&#xff1a;接收高于指定版本的任何版本 4.>&#xff1a;接受等于或者高于指定…

Vue 2 将于 12 月 31 日到达生命周期终点

随着2024年即将到来,我们借此机会提醒Vue社区,Vue 2将于2023年12月31日终止更新(EOL)。 Vue 2.0在7年多前的2016年发布。它是Vue成为主流框架旅程中的一个重要里程碑。许多现在的Vue开发者是在Vue 2时代开始使用Vue的,有许多伟大的项目是用它建立的。 然而我们无法持续同…

Mysql使用Mybatis进行时间操作

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

Docker搭建kafka集群

Docker搭建kafka集群 kafka概念 broker&#xff1a;消息中间件处理节点&#xff0c;一个broker就是一个kafka节点&#xff0c;一个或者多个broker就组成了一个kafka集群topic&#xff1a;kafka根据topic对消息进行归类&#xff0c;发布到kafka集群的每个消息&#xff0c;都要…

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

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