

사실 이전 게시물인 047_WinFormClock과 같은 맥락이다. 각각의 함수들만 약간씩 다름.
2022.06.09 - [C#] - 047_Form_Clock_C#
<Window x:Class="_048_WPFClock.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:_048_WPFClock"
mc:Ignorable="d"
Title="WFPClock" Height="350" Width="350">
<StackPanel>
<Menu>
<MenuItem Header="보기">
<MenuItem Header="아날로그 시계" Click="aClock_Click"/>
<MenuItem Header="디지털 시계" Click="dClock_Click"/>
<Separator/>
<MenuItem Header="종료" Click="Exit_Click"/>
</MenuItem>
<MenuItem Header="옵션">
<MenuItem Header="초 단위" Click="Sec_Click"/>
<MenuItem Header="밀리초 단위" Click="MS_Click"/>
</MenuItem>
</Menu>
<Grid Margin="10" ShowGridLines="True">
<Canvas x:Name="canvas1" Width="250" Height="250">
<Ellipse x:Name="aClock" Width="250" Height="250"/>
</Canvas>
<TextBlock Name="txtDate" FontFamily="맑은고딕" FontSize="15"
Margin="15,50" Foreground="OrangeRed"></TextBlock>
<TextBlock Name="txtTime" HorizontalAlignment="Center" VerticalAlignment="Center"
FontFamily="DokChampa" FontSize="40" Foreground="RoyalBlue"></TextBlock>
</Grid>
</StackPanel>
</Window>
using System.Windows;
using System.Drawing;
using System;
using System.Windows.Threading;
using System.Windows.Media;
using System.Windows.Shapes;
namespace _048_WPFClock
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
bool aClock_Flag = false;
Point center; //중심점
double radius; //반지름
int hourHand; //시침의 길이
int minHand; //분침
int secHand; //초침
DispatcherTimer timer = new DispatcherTimer();
private bool ms_flag =false;
public MainWindow()
{
InitializeComponent();
aClockSetting();
timerSetting();
}
private void timerSetting()
{
timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 0, 100); //0.1초
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
DateTime c = DateTime.Now;
if (aClock_Flag == true)
{ //analog
canvas1.Children.Clear();
DrawClockFace();
double radHr = (c.Hour % 12 + c.Minute / 60.0) * 30 * Math.PI / 180;
double radMin = (c.Minute + c.Second / 60.0) * 6 * Math.PI / 180;
double radSec = (c.Second * 6 + c.Millisecond * 6.0 / 1000) * Math.PI / 180;
DrawHands(radHr, radMin, radSec);
}
else
{ //digital
canvas1.Children.Clear();
string x = "";
txtDate.Text = DateTime.Today.ToString("D");
x = string.Format("{0:D2}:{1:D2}:{2:D2}:{3:D3}", c.Hour, c.Minute, c.Second, c.Millisecond);
txtTime.Text = x;
}
}
private void DrawHands(double radHr, double radMin, double radSec)
{
//시침
DrawLine(0, 0,
(int)(hourHand * Math.Sin(radHr)), (int)(hourHand * Math.Cos(radHr)), Brushes.HotPink, 5);
//분침
DrawLine(0, 0,
(int)(minHand * Math.Sin(radMin)), (int)(minHand * Math.Cos(radMin)), Brushes.Linen, 4);
//초침(현재 시간의 좌표를 각도를 이용하여 구하자)
DrawLine(0, 0,
(int)(secHand * Math.Sin(radSec)), (int)(secHand * Math.Cos(radSec)), Brushes.Gold, 3);
//배꼽
int coresize = 16;
Ellipse core = new Ellipse();
core.Margin = new Thickness(center.X-coresize/2,center.Y -coresize/2,0,0);
core.Stroke = Brushes.SteelBlue;
core.StrokeThickness = 3;
core.Fill = Brushes.LightSteelBlue;
core.Width = 20;
core.Height = 20;
canvas1.Children.Add(core);
}
private void DrawLine(double x1, double y1, int x2, int y2, SolidColorBrush brush, int thick)
{
Line line = new Line();
line.X1 = x1; line.Y1 = -y1; line.X2 = x2; line.Y2 = -y2;
line.Stroke = brush;
line.StrokeThickness = thick;
line.Margin = new Thickness(center.X,center.Y,0,0);
line.StrokeStartLineCap = PenLineCap.Round;
canvas1.Children.Add(line);
}
private void DrawClockFace()
{
aClock.Stroke = Brushes.LightSteelBlue;
aClock.StrokeThickness = 30;
canvas1.Children.Add(aClock);
}
private void aClockSetting()
{
center = new Point(canvas1.Width / 2, canvas1.Height / 2);
radius = canvas1.Width / 2;
hourHand = (int)(radius * 0.45);
minHand = (int)(radius * 0.55);
secHand = (int)(radius * 0.65);
}
private void MS_Click(object sender, RoutedEventArgs e)
{
ms_flag = true;
timer.Interval = new TimeSpan(0, 0, 0, 0,10); //0.1초
}
private void aClock_Click(object sender, RoutedEventArgs e)
{
aClock_Flag = true;
txtDate.Text = "";
txtTime.Text = "";
}
private void dClock_Click(object sender, RoutedEventArgs e)
{
aClock_Flag = false;
}
private void Exit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Sec_Click(object sender, RoutedEventArgs e)
{
ms_flag = false;
timer.Interval = new TimeSpan(0, 0, 0, 1); //1초
}
}
}'C#' 카테고리의 다른 글
| 050_SnakeBite(C#) (0) | 2022.06.18 |
|---|---|
| 049_Rotation_Clock_C# (0) | 2022.06.12 |
| 047_Form_Clock_C# (0) | 2022.06.09 |
| 046_Matching Game(그림 맞추기 게임)_C# (0) | 2022.06.09 |
| 045_ECG,PPG(Gragh Control) (0) | 2022.06.09 |