DLL
Timer
Grafikk
Børre Stenseth
Moduler>Assemblies>Klokke

Klokke

Hva
Image1
Et enkelt eksempel på bruk av egen DLL

Dette programmet er svært enkelt. Det viser en klokke med sekund-, minutt- og timeviser. Prosjektet benytter en DLL-fil (clockarms.dll) som er utviklt som eget prosjekt, se modulen Visere. Denne DLL'en regner ut hvor de respektive viserne skal stå gitt tidspunktet.

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.

Referanser
  • DLL-prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/clockarms
  • Klokke-prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/clock
Vedlikehold

B.Stenseth, revidert desember 2006

(Velkommen) Moduler>Assemblies>Klokke (Visere)