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;
}
}
}
Teşekkürler verdiğiniz kodlarla yaptım fakat kendim yapmak istiyorum acaba hangi konuları iyi bilmem gerekiyor?
YanıtlaSilMerhaba, 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