螺旋 TrackBar 控件






4.97/5 (71投票s)
一个将轨道线显示为螺旋的 TrackBar 控件
- 下载 SpiralTrackBar_110_Demo - 126.6 KB
- 下载 SpiralTrackBar_110_Library - 4.3 MB
- 下载 SpiralTrackBar_110_Source - 459.1 KB
引言
这是 1.1.0 版本。它使用了新的 SimpleWidgets2 库,修复了当以编程方式更改位置时标记不会在视觉上更新的错误,并使用 .NET Framework 3.5、.NET Framework 6.4.2 和 .NET 6.0 进行编译。
SpiralTrackBar
类是 .NET Windows Forms TrackBar
控件的替代品,它将轨道线显示为螺旋线。
![]() | ![]() |
所有 public
和 protected
类、方法和属性都已使用标准的 C# XML 文档注释进行了全面记录。该项目包含 .chm 和 .mshc 格式的帮助文件。有关使用该类的更多详细信息,请参阅帮助文件中的概述部分。
在 Visual Studio Designer 中,控件的所有成员对于 .NET Framework 项目都是完全可配置的。
SpiralTrackBar_110_Demo
下载包含:
GAW.SpiralTrackBar.Net462.dll | 为 .NET Framework 4.6.2 编译的库。 | ||
GAW.SimpleWidgets2.Net462.dll | 所需的 SimpleWidgets2 库。 | ||
GAW.SpiralTrackBar.ExplorerApp.Net462.exe | 演示 SpiralTrackBar 所有属性的示例应用程序。 |
SpiralTrackBar_110_Library
下载包含了上述文件,以及 .NET Framework 3.5 和 .NET 6.0 的相应文件,以及 .chm 和 .mshc 格式的帮助文件。
SpiralTrackBar_110_Source
下载包含了 SpiralTrackBar
控件和 ExplorerApp 的源代码,以及构建帮助文件所需的必要文件。它不包含 SimpleWidgets2
库的源代码。该库在另一个项目中提供。
关于 .NET 6.0 的注意事项
Visual Studio 2022 中的 Windows Forms (WinForms) 设计器仅适用于 .NET Framework,而尚不适用于 .NET 6.0。推荐的解决方法是创建一个 .NET Framework 4.6.2 项目,创建必要的 GUI 组件,然后将生成的 WinForms 代码复制到 .NET 6.0 项目中。
使用控件
可能的值范围是从 Minimum
到 Maximum
,增量为 StepSize
。当前值由 Value
属性指定,当标记逆时针移动时,该值会增加;当标记顺时针移动时,该值会减小。
轨道线
轨道线的大小和方向由 StartAngle
、Rotations
、IndentStart
和 IndentStop
属性决定。
StartAngle
以度为单位,从 x 轴逆时针测量。Rotations
是轨道线弧的长度(例如,1.5 表示 540 度)。缩进值相对于控件的大小,其中 0.0 定义为控件的中心,1.0 定义为从控件中心到最近边缘的距离。
轨道线的形状由 TrackFillSize
、TrackBorder
、TrackFill
和 TrackEnd
属性决定。
刻度线
刻度线的长度和位置由 TickLength
和 TickStyle
属性决定。线条的粗细、颜色和样式由 TickLine
决定。
主刻度每 MajorTickFrequency
步出现一次。次刻度每 MinorTickFrequency
步出现一次(如果此值为零,则没有次刻度)。主刻度长 TickLength
像素。次刻度长度为一半。
刻度线上的刻度间距由 TickSpacing
属性确定。如果 TickSpacing
为 SpiralTrackBarTickSpacing.ArcLength
,则刻度线沿轨道线均匀分布。如果 TickSpacing
为 SpiralTrackBarTickSpacing.Angular
,则刻度线使用角度增量进行间隔。在这种情况下,刻度线将在轨道线的开头处靠得更近,在末尾处靠得更远。
![]() | ![]() |
Angular | 弧长 |
标记
标记指示轨道线上的当前值。它可以被鼠标拖动或以编程方式移动。
标记的形状由 MarkerShape
决定,边框由 MarkerBorder
决定,内部填充由 MarkerFill
决定。
螺旋线数学
本节解释了绘制螺旋线、绘制刻度线和计算弧长的数学原理。
极坐标系中螺旋线的方程是:
其中 \(r\) 是到中心的距离,\(\theta\) 是角度,以弧度为单位,从 x 轴逆时针测量。常数 \(A\) 和 \(B\) 取决于控件的大小、缩进值以及起始和停止角度。
其中
\(m\) | 控件宽度和高度的最小值 |
\(i_1, i_2\) | IndentStart 、IndentStop 成员 |
\(r_1, r_2\) | StartAngle 、StopAngle 成员(以弧度为单位) |
将极坐标点转换为笛卡尔坐标的公式是:
刻度线位置
刻度线垂直于螺旋线的切线绘制,因此我们需要计算切线。极坐标系中曲线切线的通用方程是:
其中 \(r '\) 是 \(r\) 的一阶导数。在螺旋线的情况下:
因此,螺旋线上 \(\theta\) 位置的刻度线斜率是:
弧长
为了使刻度线等距地放置在螺旋线上,我们需要计算曲线的弧长。极坐标系中曲线弧长的通用方程是:
这会展开为:
这个积分的复杂解出自《数学表格手册》(第 4 版)(第 562 页 - 积分公式 #242)。经过许多步骤(此处未显示),弧长的最终方程是:
请注意,此方程不能被反解。也就是说,不存在函数 \(\theta = f(L)\)。
因此,对于给定的弧长 \(L\),找到 \(\theta\) 的唯一方法是通过插值。
关注点
在推导出弧长公式的解之后,我担心这会是一项昂贵的计算,需要重复执行——平方根和对数运算(在计算上)并不便宜。我的计划是构建一个预先计算好的值表,以减少插值时需要进行的计算次数。事实证明,预先计算好的值是不必要的。我的电脑——于 2008 年购买,配备 Pentium D 处理器——能够在一毫秒内完成超过四千次弧长计算,即每秒约四百万次计算。
进一步的研究使我发现,Pentium 处理器具有处理许多曾经需要在软件中完成的浮点运算的指令,例如平方根、对数和三角函数。对我来说,这是一个哇!的时刻。我第一次学习汇编是在 40 年前,使用的是 Z-80,一种具有一定 16 位功能的 8 位处理器。它的算术指令仅限于整数的加、减和移位。它甚至没有 8 位乘法的指令。我们已经走了很长的路。
有三个只读属性可以显示控件内部的统计信息:
CalcLayoutArcCount
- 执行的弧长计算次数CalcLayoutTime
- 计算最近一次布局的毫秒数PaintTime
- 在最近一次绘制操作中花费的毫秒数
未来的更改
一旦 Visual Studio Windows Forms Designer 对 .NET 应用程序的设计器问题得到解决,SpiralTrackBar 就会进行更新。希望这很快就会发生……
历史
- 2022 年 12 月 6 日 - 发布 1.1.0
- 添加了 XML 序列化。
- 添加了 GenerateCode 方法,该方法可生成初始化源代码。
- 修复了以编程方式更改位置时标记不会在视觉上更新的错误。
- 将项目更改为使用 SimpleWidgets2 库,而不是 SimpleWidgets。
- 更改项目,以便使用 Visual Studio 2022 为 .NET Framework 3.5、.NET Framework 4.6.2 和 .NET 6.0 编译库。
- 更改帮助文件以与 Sandcastle Help File Builder 2021.11.7.0 一起使用。
- 修复了文章中数学格式的问题。
- 2020 年 10 月 12 日 - 发布 1.0.3
- 修复了起始角度为零且旋转次数大于 1.0 时,标记可能跳转到错误轨道的问题。
- 2014 年 9 月 13 日 - 发布 1.0.2
- 将 .csproj 文件转换为 Visual Studio 2013 格式。
- 将帮助文件转换为与 SandCastle Help File Builder 2014.5.31.0 配合使用。
- 2014 年 2 月 5 日 - 发布 1.0.1
- 修复了文档中缺失的标记。
- 2014 年 2 月 2 日 - 首次发布