模拟时钟






3.36/5 (14投票s)
2004 年 8 月 3 日
3分钟阅读

96992

2347
一个可以根据给定时间发出警报,并且可以设置倒计时警报的模拟时钟控件。
引言
我是一名在家工作的软件开发人员。 这意味着我在从事项目时必须处理许多杂务。 很多时候,当我忙于编写一些引人入胜的程序时,我往往会忘记一些重要的杂务。 因此,我决定开发一个模拟闹钟控件,该控件可以设置特定时间的闹钟以及倒计时闹钟。 我决定用 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;
GetCos
和 GetSin
方法将度数转换为弧度。
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
对象在真实示例中的简单用法,该示例可以与其他需要警报的应用程序结合使用。 我在我的控件中包含了一些更多功能,还包括了如何使用它和设置闹钟时间的演示项目。