반응형
이 포스팅에서는 약간의 그래픽 클래스를 사용하여 C# 아날로그 시계를 디자인할 것입니다 . 또한 타이머를 사용하여 시계 포인터를 계속해서 움직였습니다.
개념
먼저 일부 각도 값을 초침, 분침, 시침으로 초기화하겠습니다.
그런 다음 그래픽 클래스를 사용하여 시계를 그리고 이를 비트맵 변수로 저장한 다음 그림 상자에 로드합니다.
마지막으로 타이머를 사용하여 초침을 움직입니다.
지침
Visual C#에서 새 Windows 양식 응용 프로그램 프로젝트를 만듭니다.
양식에 그림 상자를 추가합니다.
코드 보기로 전환하려면 양식을 두 번 클릭하세요.
기존 코드를 모두 삭제하고 아래 코드를 붙여넣으세요.
C# 아날로그 시계 프로그램
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 AnalogClock
{
public partial class Form1 : Form
{
Timer t = new Timer();
int WIDTH = 300, HEIGHT = 300, secHAND = 140, minHAND = 110, hrHAND = 80;
//center
int cx, cy;
Bitmap bmp;
Graphics g;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//create bitmap
bmp = new Bitmap(WIDTH + 1, HEIGHT + 1);
//center
cx = WIDTH / 2;
cy = HEIGHT / 2;
//backcolor
this.BackColor = Color.White;
//timer
t.Interval = 1000; //in millisecond
t.Tick += new EventHandler(this.t_Tick);
t.Start();
}
private void t_Tick(object sender, EventArgs e)
{
//create graphics
g = Graphics.FromImage(bmp);
//get time
int ss = DateTime.Now.Second;
int mm = DateTime.Now.Minute;
int hh = DateTime.Now.Hour;
int[] handCoord = new int[2];
//clear
g.Clear(Color.White);
//draw circle
g.DrawEllipse(new Pen(Color.Black, 1f), 0, 0, WIDTH, HEIGHT);
//draw figure
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));
//second hand
handCoord = msCoord(ss, secHAND);
g.DrawLine(new Pen(Color.Red, 1f), new Point(cx, cy), new Point(handCoord[0], handCoord[1]));
//minute hand
handCoord = msCoord(mm, minHAND);
g.DrawLine(new Pen(Color.Black, 2f), new Point(cx, cy), new Point(handCoord[0], handCoord[1]));
//hour hand
handCoord = hrCoord(hh % 12, mm, hrHAND);
g.DrawLine(new Pen(Color.Gray, 3f), new Point(cx, cy), new Point(handCoord[0], handCoord[1]));
//load bmp in picturebox1
pictureBox1.Image = bmp;
//disp time
this.Text = "Analog Clock - " + hh + ":" + mm + ":" + ss;
//dispose
g.Dispose();
}
//coord for minute and second hand
private int[] msCoord(int val, int hlen)
{
int[] coord = new int[2];
val *= 6; //each minute and second make 6 degree
if (val >= 0 && val <= 180)
{
coord[0] = cx + (int)(hlen * Math.Sin(Math.PI * val / 180));
coord[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
}
else
{
coord[0] = cx - (int)(hlen * -Math.Sin(Math.PI * val / 180));
coord[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
}
return coord;
}
//coord for hour hand
private int[] hrCoord(int hval, int mval, int hlen)
{
int[] coord = new int[2];
//each hour makes 30 degree
//each min makes 0.5 degree
int val = (int)((hval * 30) + (mval * 0.5));
if (val >= 0 && val <= 180)
{
coord[0] = cx + (int)(hlen * Math.Sin(Math.PI * val / 180));
coord[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
}
else
{
coord[0] = cx - (int)(hlen * -Math.Sin(Math.PI * val / 180));
coord[1] = cy - (int)(hlen * Math.Cos(Math.PI * val / 180));
}
return coord;
}
}
}
반응형
'.Net-C#' 카테고리의 다른 글
C# 로컬 데이터베이스 – 로컬 데이터베이스 연결 및 사용 방법(SQL Server) (0) | 2024.01.24 |
---|