Alarmklokke
Utvidelsen av selve klokkekoden er liten. Det eneste nye er at vi skal spille noen lyder hver hele time, metoden PlaySound, og vi skal tegne en alarmviser.
Form1
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; using System.Media; using System.Threading; namespace niceclock { public partial class Form1 : Form { private int ms_since_alarm = 0; private bool alarmeIsOn = false; public Form1() { InitializeComponent(); //this.SetBounds(100, 100, 400, 400 + 100); } private void timer1_Tick(object sender, EventArgs e) { // refresh clock ms_since_alarm = Math.Min(ms_since_alarm + timer1.Interval, 100000); clockPanel.Invalidate(); DrawArms(this.clockPanel.CreateGraphics()); } private void clockPanel_Paint(object sender, PaintEventArgs e) { DrawArms(e.Graphics); } protected void DrawArms(Graphics g) { // assume clock has radius 1 Matrix m = new Matrix(); m.Reset(); m.Translate(0.5f, 0.5f); m.Scale(0.4f, -0.4f); g.Transform = m; //Rectangle R = this.ClientRectangle; Rectangle R = clockPanel.ClientRectangle; float factor = (float)Math.Min(R.Height, R.Width); g.PageScale = factor; Brush markbrush = new SolidBrush(Color.Black); Pen markpen = new Pen(markbrush); // mark hours markpen.Width = 0.005f; double angle = 0.0; while (angle < 2 * Math.PI + 0.01f) { float x = (float)Math.Cos(angle); float y = (float)Math.Sin(angle); g.FillEllipse(markbrush, x - 0.03f, y - 0.03f, 0.06f, 0.06f); angle += Math.PI / 6; } DrawArmsNow(g); if (alarmeIsOn) DrawAlarm(g); } private void DrawArmsNow(Graphics g) { Brush markbrush = new SolidBrush(Color.Black); Pen markpen = new Pen(markbrush); // seconds arm markpen.Width = 0.005f; double angle = clockarms.TimeAngle.SecondAngleNow; g.DrawLine(markpen, 0.0f, 0.0f, (float)Math.Cos(angle * (Math.PI / 180.0)), (float)Math.Sin(angle * (Math.PI / 180.0))); // minutes arm markpen.Width = 2 * markpen.Width; angle = clockarms.TimeAngle.MinuteAngleNow; g.DrawLine(markpen, 0.0f, 0.0f, 0.7f * (float)Math.Cos(angle * (Math.PI / 180.0)), 0.7f * (float)Math.Sin(angle * (Math.PI / 180.0))); // hours arm markpen.Width = 2 * markpen.Width; angle = clockarms.TimeAngle.HourAngleNow; g.DrawLine(markpen, 0.0f, 0.0f, 0.5f * (float)Math.Cos(angle * (Math.PI / 180.0)), 0.5f * (float)Math.Sin(angle * (Math.PI / 180.0))); } private void DrawAlarm(Graphics g) { Brush markbrush = new SolidBrush(Color.Red); Pen markpen = new Pen(markbrush); double angle = 0.0; markpen.Width = 0.005f; // AlarmTime: // year,month,day is irrelevant, seconds allways null DateTime alarmTime = new DateTime(2006, 12, 10, Convert.ToInt32(numericHours.Value), Convert.ToInt32(numericMinutes.Value), 0); // hours arm markpen.Width = 3 * markpen.Width; angle = clockarms.TimeAngle.HourAngle(alarmTime); g.DrawLine(markpen, 0.0f, 0.0f, (float)Math.Cos(angle * (Math.PI / 180.0)), (float)Math.Sin(angle * (Math.PI / 180.0))); int alarmMinutes = 60 * alarmTime.Hour + alarmTime.Minute; DateTime dt=DateTime.UtcNow.ToLocalTime(); int nowMinutes = 60 * (dt.Hour % 12) + dt.Minute; if ((alarmMinutes == nowMinutes) && (ms_since_alarm > 61000)) { playSound(); ms_since_alarm = 0; } } private void playSound() { // pick sound from app resources SoundPlayer snd = new SoundPlayer(Properties.Resources.clock_alarm); snd.PlaySync(); saynumber.Talker.Say(DateTime.UtcNow.ToLocalTime().Hour); saynumber.Talker.Say(DateTime.UtcNow.ToLocalTime().Minute); } private void button1_Click(object sender, EventArgs e) { // user want to set alarm alarmeIsOn = !alarmeIsOn; if (alarmeIsOn) button1.Text = "Skru av alarm"; else button1.Text = "Sett p� alarm"; } } }
Merk at selve alarmen er inkludert i klokkalarmprosjektet som en ressurs, mens alle klokkeslettene er lagret i saynumber.
Den kompilerte versjonen av de to dll-filene, clocarms.dll (som beregner viservinkler) og saynumber.dll må koples til i Visual Studio dersom du skal eksperimentere med dette klokkeprosjektet. Dette gjøres ved å høyreklikke på References i Solution Explorer-vinduet i Visual Studio og velge "Add Reference..". Det kommer da opp en dialogboks som gir deg noen valg. Du kan enten velge fra lista over assemblies som er registrerte som system globale eller i dette tilfellet må du browse til den katalogen der du har plassert de to dll-filene.