模拟时钟控件






4.58/5 (60投票s)
模拟时钟控件几乎具备了时钟控件应有的所有功能,并且完全可自定义。
引言
在这里,我们使用 VB.NET 控件库创建了一个模拟时钟。它是一个时钟控件,几乎具备此类控件应有的所有功能,并且完全可自定义。由于这是一个控件库,您可以在 .NET 环境下的 C++、C#、J# 和 VB.NET 项目中使用它。
我创建此控件是为了帮助 VB 论坛上的某个人。起初,它只是一个非常简单的时钟,但后来随着我添加了许多属性、事件和使其时钟非常灵活的功能,它变得相当高级。
添加组件
要使用该控件,您只需将其添加到 VS.NET 工具箱中。右键单击工具箱区域,然后选择“选择项”菜单项。这将打开“选择工具箱项”窗口。导航到包含“AnalogClockLib.dll”文件的目录并选择它,然后单击“确定”按钮。这将把控件添加到工具箱中。
最后,将控件拖放到您的窗体上。另外,为了在代码设计器中看到属性或方法的描述,您应该将“AnalogClockLib.xml”文件复制到项目的文件夹中。
背景
该时钟控件是一个 Windows UserControl。时钟的几乎所有元素(元素的核心)都是使用 GraphicsPath
数据类型构建的。它们包含一个成员变量 Base-Path
,它是一个元素的 GraphicsPath
。这些 Base-Path
s 对于每个元素的使用方式都不同。例如,刻度的 Base-Path
表示一个在 12 点位置构建然后使用 Matrix
对象旋转的 GraphicsPath
。由于它只旋转一次,因此不需要任何其他辅助对象。时钟的指针有两个 GraphicsPath
类型的成员变量:Base-Path
和 Shift-Path
。指针的 Base-Path
始终定位在 12 点钟位置,并且仅在修改元素的形状(宽度、长度或样式)时才会重塑。另一方面,Shift-Path
是指针在任何给定时间的实际 GrapicsPath
。Shift-Path
是旋转的 Base-Path
的副本。
Using the Code
虽然您可以使用此控件做几乎任何事情,但我将只向您展示如何使用 PathGradientBrush
绘制时钟的小时指针。请注意,通过这种方式,您可以使用任何画笔绘制元素。
看到时钟指针的渐变效果非常好,所以这里是您如何实现这一点。基本上,您会在指针的绘制事件中将指针的 Brush
属性设置为一个新创建的渐变画笔对象。
Private Sub Clock1_HourHandPainting(ByVal sender As Object, _
ByVal e As AnalogClock.PaintEventArgs) Handles Clock1.HourHandPainting
'Make sure the hour hand's graphics path contains more than 2 points.
If Me.Clock1.HourHand.Path.PointCount > 2 Then
'Make the hour hand gradient
Dim br As New Drawing2D.PathGradientBrush(Me.Clock1.HourHand.Path)
br.CenterColor = Color.White
br.SurroundColors = New Color() {Me.Clock1.HourHand.Color}
e.Brush = br
br.Dispose()
End If
End Sub
在某些情况下,您可能需要将时钟时间设置为某个起始时间。为此,我们需要做一些计算,并相应地设置 UtcOffset
属性。以下是执行此操作的方法:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim cdt As DateTime = CDate("#17:20:35#") 'Some custom start time for the clock.
Dim utcDt As DateTime = DateTime.UtcNow 'The current UTC dateTime.
'This is needed because the clock internal works with UTC dateTime.
Me.Clock1.UtcOffset = New TimeSpan(0, cdt.Hour - utcDt.Hour, _
cdt.Minute - utcDt.Minute, cdt.Second - utcDt.Second)
End Sub
有时人们会问我为什么夏令时之后时钟会晚一小时,或者我们如何确保时钟始终显示正确的时间。好吧,如果您的时钟出现这种情况,那么您需要确保时钟的 UtcOffset
始终准确。这是您可以做到这一点的方法:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Set UTC offset to the system utc offset when the application loads
Me.Clock1.UtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)
End Sub
Private Sub Clock1_TimeChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Clock1.TimeChanged
'Set UTC offset to the system utc offset every time clock time changes.
'If the property has the same value it will do nothing.
Me.Clock1.UtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)
End Sub
有关更多示例,请查看演示项目。
模拟时钟控件信息
- 作者:Arman Ghazanchyan
- 当前程序集版本:1.5.0.3
- 当前文件版本:1.0.0.5
- 模拟时钟控件的外部链接
历史
- 1.0.0.0 -- 发布了原始版本
- 1.0.2813.38699 -- 对数字和刻度样式进行了一些小的更改。此外,UTC 偏移值的范围已更改,接受从 -23:00:00 到 23:00:00 的值。
- 1.0.2847.27310 -- 此更新添加了一个可用于获取/设置时钟边框线颜色的属性。此外,时钟也有一些更正。建议更新。
- 1.0.2917.23783 -- 一个小的 bug 修复
- 1.0.3002.36694 -- 添加了分钟刻度线宽度属性
- 1.0.3223.6598 -- 此更新包括对时钟实现的重大更改。如果您喜欢模拟时钟的早期版本,那么您会爱上这个版本。在此版本中,您可以在设计时和运行时修改时钟的每个元素。有很多好东西我想提及,但最好您自己尝试一下。我提醒您检查时钟的所有属性,特别是
Properties
窗口中的Element
类别,其中包含时钟的指针、刻度等。希望您会喜欢。 - 1.5.0.3 -- 一些 bug 修复