C# Analog Saat


AnalogSaat adlı projemizi oluşturduktan sonra formumuza öncelikle Toolbox penceresinden bir adet pictureBox ekliyoruz ve Properties penceresinden veya pictureBox'un sağ üst köşesindeki küçük ok aracılığıyla SizeMode'unu Zoom olarak ayarlıyoruz.

Tüm kodlar açıklamaları ile birlikte aşağıda yer almaktadır.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AnalogSaat
{
    public partial class Form1 : Form
    {
        Timer t = new Timer();

        int genislik = 300, yukseklik = 300; 
        int saniye = 140, dakika = 110, saat = 80;

        int cx, cy;
        Bitmap bmp;
        Graphics g;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        bmp = new Bitmap(genislik + 1, yukseklik + 1);

        cx = genislik / 2;
        cy = yukseklik / 2;

        this.BackColor = Color.White;

        t.Interval = 1000; // milisaniye
        t.Tick += new EventHandler(this.t_TikTak);
        t.Start();
        }

        private void t_TikTak(object sender, EventArgs e) 
        { 
        //grafik oluşturma
        g = Graphics.FromImage(bmp);

        //zamanı alma
        int sn = DateTime.Now.Second;
        int dk = DateTime.Now.Minute;
        int s = DateTime.Now.Hour;

        int[] koordinat = new int[2];

        //temizle
        g.Clear(Color.White);

        //daire çizme
        g.DrawEllipse(new Pen(Color.Black, 1f), 0, 0, genislik, yukseklik);

        //figürleri çizme
        g.DrawString("12", new Font("Arial", 12), Brushes.Black, new PointF(140, 2));
        g.DrawString("3", new Font("Arial", 12), Brushes.Black, new PointF(286, 140));
        g.DrawString("6", new Font("Arial", 12), Brushes.Black, new PointF(142, 282));
        g.DrawString("9", new Font("Arial", 12), Brushes.Black, new PointF(0, 140)); 

        //saniye
        koordinat = Kordinat(sn, saniye);
        g.DrawLine(new Pen(Color.Red, 1f), new Point(cx, cy), new Point(koordinat[0], koordinat[1]));

        //dakika
        koordinat = Kordinat(dk, dakika);
        g.DrawLine(new Pen(Color.Black, 2f), new Point(cx, cy), new Point(koordinat[0], koordinat[1]));

        //saat
        koordinat = sKordinat(s%12, dk, saat);
        g.DrawLine(new Pen(Color.Gray, 3f), new Point(cx, cy), new Point(koordinat[0], koordinat[1]));  
    
        // picturebox'a bmp yükleme
        pictureBox1.Image = bmp;

        //zamanı gösterme
        this.Text = "Analog Saat - " + s + ":" + dk + ":" + sn;    
                
        g.Dispose();  
        }

        // dakika ve saniye için koordinat
        private int[] Kordinat(int val, int hlen)
        {
            int[] kordinat = new int[2];
            val *= 6; // her dakika ve saniye 6 derece
            if (val >= 0 && val <= 180)
            {
                kordinat[0] = cx + (int)(hlen * Math.Sin(Math.PI * val / 180));
                kordinat[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
            }
            else 
            {
                kordinat[0] = cx - (int)(hlen * -Math.Sin(Math.PI * val / 180));
                kordinat[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
            }
            return kordinat;       
        }

        // saat için koordinat
        private int[] sKordinat(int sval, int dval, int hlen)
        {
            int[] kordinat = new int[2];
            //her saat 30 derece, her dakika 0.5 derece
            int val = (int)((sval*30) +(dval*0.5));
           
            if (val >= 0 && val <= 180)
            {
                kordinat[0] = cx + (int)(hlen * Math.Sin(Math.PI * val / 180));
                kordinat[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
            }
            else
            {
                kordinat[0] = cx - (int)(hlen * -Math.Sin(Math.PI * val / 180));
                kordinat[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
            }
            return kordinat;
        }     
    }
}

2 yorum:

  1. Teşekkürler verdiğiniz kodlarla yaptım fakat kendim yapmak istiyorum acaba hangi konuları iyi bilmem gerekiyor?

    YanıtlaSil
    Yanıtlar
    1. Merhaba, matematik fonksiyonlarına ve çizim fonksiyonlarına hakim olursanız yeterli olacağını düşünüyorum. Ama naçizane fikrim, her programda en önemli konu, en doğru algoritmayı oluşturmak ve geliştirmektir :) Kolay gelsin.

      Sil

Blogger tarafından desteklenmektedir.