Moduler>Assemblies>Klokke
Klokke
Form
Koden er ganske enkel og rett fram. Det er to ting å merke seg:
- Jeg har satt opp en timer som slår til hvert sekund. Dette er gjort i GUI-designeren i Visual Studio. Se metoden timer1_Tick nedenfor.
- Jeg har valgt å mappe klokka fra en enkel modell med radius 1 til den til en hver tid aktuelle vindusstørrelsen.
Koden er slik:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; namespace clock2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { // avoid flicker (dirty) DrawArms(panelClock.CreateGraphics()); panelClock.Invalidate(); } protected void DrawArms(Graphics g) { textBox1.Text = DateTime.Now.TimeOfDay.ToString().Substring(0, 8); // 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.panelClock.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; } // seconds arm markpen.Width = 0.005f; 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 panelClock_Paint(object sender, PaintEventArgs e) { DrawArms(e.Graphics); } } }
DLL-fil
Den kompilerte versjonen av denne, clockarms.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 clockarms.dll.