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

模拟时钟

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.36/5 (14投票s)

2004 年 8 月 3 日

3分钟阅读

viewsIcon

96992

downloadIcon

2347

一个可以根据给定时间发出警报,并且可以设置倒计时警报的模拟时钟控件。

Sample Image - analogclock.jpg

引言

我是一名在家工作的软件开发人员。 这意味着我在从事项目时必须处理许多杂务。 很多时候,当我忙于编写一些引人入胜的程序时,我往往会忘记一些重要的杂务。 因此,我决定开发一个模拟闹钟控件,该控件可以设置特定时间的闹钟以及倒计时闹钟。 我决定用 C# 实现这个控件。

当我开始开发应用程序时,我遇到了一个特殊的问题。 你知道在 C# 中,余弦和正弦函数的参数以弧度而不是角度为单位。 问题是如何使用弧度绘制时钟表面? 这意味着将时钟的 12 个数字以彼此成 30 度的角度绘制,并且时钟显示分针、秒针和时针。 我在下面给出了我使用的方法。

代码

绘制时钟表面

要绘制时钟,我们在适当的位置写入数字 1 到 12。我们将位置指定为 x、y 坐标,想象它们位于一个假想的圆圈上。 使用 Graphics 对象的重载 DrawString 方法在时钟表面上绘制每个数字。

void DrawString(string, Font, Brush, float, float, StringFormat);

如何计算 x、y 坐标

x 坐标可以通过将角度的余弦乘以半径来找到。 一个圆是 360 度。 为了在圆上放置 12 个数字,每个数字应该与前一个数字相距 30 度。 C# 余弦和正弦函数的参数以弧度而不是角度为单位。 要将角度转换为弧度

radians = (degrees * PI) / 180
x = GetCos( i * deg + 90) * FaceRadius;
y = GetSin( i * deg + 90) * FaceRadius;

GetCosGetSin 方法将度数转换为弧度。

private static float GetSin(float degAngle)
{
   return (float) Math.Sin(Math.PI * degAngle / 180);
}
private static float GetCos(float degAngle)
{
   return (float) Math.Cos(Math.PI * degAngle / 180);
}

绘制指针(时针、分针、秒针)

使用 Pen 对象绘制指针。 EndCap 属性的类型为 LineCap。 此示例中使用了 ArrowAnchor(请查看 Zip 文件中的代码)。

Pen hourPen = new (Color.Red);
hourPen.EndCap = LineCap.ArrowAnchor;

创建 GetSecondRotation()GetMinuteRotation() 方法以返回一个浮点数,指示旋转多少。

private float GetSecondRotation()
{
   return(360f * currentTime.Second / 60f);
}

private float GetMinuteRotation()
{
   return(360f * currentTime.Minute / 60f);
}

GetHourRotation() 方法很困难,因为我们必须将表面设置为 24 小时模式,并且如果时钟表面上有 24 小时而不是 12 小时,则时针的角度会有所不同。

private float GetHourRotation()
{
   float deg = b24Hours ? 15 : 30; 
   //30 degrees if 12 hour clock face or 15 degrees 
   //if 24 hr clock face.
   float numHours = b24Hours ? 24 : 12;
   return(360f *currentTime.Hour / numHours + deg*currentTime.Minute / 60f);
}

绘制新时间

一旦绘制了秒针、分针和时针,将 currentTime 设置为新时间。

currentTime = newTime;

最后,我还声明了两个属性:AlarmTime 允许您发出警报,countDownTime 允许您将倒计时计时器设置为毫秒。

代码参考

时钟表面的实现是自制的,但“如何使用 Graphics 对象”的代码取自 O'Reilly 的文章“Programming .NET Application”。 向 O'Reilly 致敬,因为他开发的用于绘制时钟表面的类非常易于应用和重用。

结论

此控件演示了 Graphics 对象在真实示例中的简单用法,该示例可以与其他需要警报的应用程序结合使用。 我在我的控件中包含了一些更多功能,还包括了如何使用它和设置闹钟时间的演示项目。

© . All rights reserved.