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

模拟时钟控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (60投票s)

2007 年 6 月 29 日

CPOL

4分钟阅读

viewsIcon

335397

downloadIcon

30930

模拟时钟控件几乎具备了时钟控件应有的所有功能,并且完全可自定义。

引言

在这里,我们使用 VB.NET 控件库创建了一个模拟时钟。它是一个时钟控件,几乎具备此类控件应有的所有功能,并且完全可自定义。由于这是一个控件库,您可以在 .NET 环境下的 C++、C#、J# 和 VB.NET 项目中使用它。

我创建此控件是为了帮助 VB 论坛上的某个人。起初,它只是一个非常简单的时钟,但后来随着我添加了许多属性、事件和使其时钟非常灵活的功能,它变得相当高级。

Analog_Clock/ClocksImg.png

添加组件

要使用该控件,您只需将其添加到 VS.NET 工具箱中。右键单击工具箱区域,然后选择“选择项”菜单项。这将打开“选择工具箱项”窗口。导航到包含“AnalogClockLib.dll”文件的目录并选择它,然后单击“确定”按钮。这将把控件添加到工具箱中。

最后,将控件拖放到您的窗体上。另外,为了在代码设计器中看到属性或方法的描述,您应该将“AnalogClockLib.xml”文件复制到项目的文件夹中。

背景

该时钟控件是一个 Windows UserControl。时钟的几乎所有元素(元素的核心)都是使用 GraphicsPath 数据类型构建的。它们包含一个成员变量 Base-Path,它是一个元素的 GraphicsPath。这些 Base-Paths 对于每个元素的使用方式都不同。例如,刻度的 Base-Path 表示一个在 12 点位置构建然后使用 Matrix 对象旋转的 GraphicsPath。由于它只旋转一次,因此不需要任何其他辅助对象。时钟的指针有两个 GraphicsPath 类型的成员变量:Base-PathShift-Path。指针的 Base-Path 始终定位在 12 点钟位置,并且仅在修改元素的形状(宽度、长度或样式)时才会重塑。另一方面,Shift-Path 是指针在任何给定时间的实际 GrapicsPathShift-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

有关更多示例,请查看演示项目。

模拟时钟控件信息

历史

  • 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 修复
© . All rights reserved.