시간이 표시되는 간단한 계산기를 만들어 보겠습니다. 이 계산기는 이번 학기 중간고사 시험문제였습니다. 계산기를 만들 수 있는지, 그리고 Timer를 사용할 수 있는지를 테스트하기 위한 프로그램입니다.
완성된 모습은 다음과 같습니다.
일단 XAML로 디자인을 하겠습니다.
크게 보면 위쪽에 숫자와 시간을 표시하는 부분과 아래의 20개의 Button이 있는 부분이 있습니다. 위 부분은 Grid 안에 TextBox와 TextBlock을 적절히 위치하면 되겠습니다.
아래의 버튼 부분은 Grid를 Row=4, Column=5의 20개 Grid로 분할하고 각 Grid에 Button을 하나씩 두면 되겠습니다.
이 두개의 Grid를 StackPanel에 넣으면 위, 아래로 배치되겠습니다.
Xaml 코드는 다음과 같습니다.
<Window x:Class="TimerCalc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="시계계산기 by Beeeye Dmu" Height="300" Width="400">
<StackPanel>
<Grid>
<TextBox x:Name="txtResult" Margin="20" HorizontalContentAlignment="Right"
VerticalContentAlignment="Bottom" Height="65" FontSize="32">0</TextBox>
<TextBlock x:Name="txtTime" Margin="20,25,25,0" HorizontalAlignment="Right"></TextBlock>
</Grid>
<Grid Margin="20,0,15,0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Margin="0,0,5,5" Height="30" Grid.Row="0" Grid.Column="0" Click="PlusMinus_Click">±</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="0" Grid.Column="1" Click="Sqrt_Click">√</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="0" Grid.Column="2" Click="reci_Click">1/x</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="0" Grid.Column="3" Click="bs_Click">←</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="0" Grid.Column="4" Click="C_Click">C</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="1" Grid.Column="0" Click="Op_Click">+</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="1" Grid.Column="1" Click="Op_Click">-</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="1" Grid.Column="2" Click="Op_Click">×</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="1" Grid.Column="3" Click="Op_Click">/</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="1" Grid.Column="4" Click="Eq_Click">=</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="2" Grid.Column="0" Click="num_Click">5</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="2" Grid.Column="1" Click="num_Click">6</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="2" Grid.Column="2" Click="num_Click">7</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="2" Grid.Column="3" Click="num_Click">8</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="2" Grid.Column="4" Click="num_Click">9</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="3" Grid.Column="0" Click="num_Click">0</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="3" Grid.Column="1" Click="num_Click">1</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="3" Grid.Column="2" Click="num_Click">2</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="3" Grid.Column="3" Click="num_Click">3</Button>
<Button Margin="0,0,5,5" Height="30" Grid.Row="3" Grid.Column="4" Click="num_Click">4</Button>
</Grid>
</StackPanel>
</Window>
"+", "-", "x", "/"의 4개 연산자 버튼은 Op_Click()이라는 이벤트 함수를 생성합니다.
"0"~"9"까지의 10개 버튼은 num_Click()이라는 이벤트 함수를 생성합니다.
CS 파일은 다음과 같습니다.
...
using System.Windows.Threading; // Timer를 사용하기 위함
namespace TimerCalc
{
public partial class MainWindow : Window
{
private double lvalue;
private char op;
private string oper;
private bool op_after = false;
DispatcherTimer myTimer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
myTimer.Interval = new TimeSpan(0, 0, 1);
myTimer.Tick += myTimer_Tick;
myTimer.Start();
}
void myTimer_Tick(object sender, EventArgs e)
{
txtTime.Text = DateTime.Now.ToString();
}
private void num_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
string num = btn.Content.ToString();
if (txtResult.Text == "0" || op_after == true)
txtResult.Text = num;
else
txtResult.Text += num;
op_after = false;
}
private void PlusMinus_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = (-double.Parse(txtResult.Text)).ToString();
}
private void Sqrt_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = (Math.Sqrt(double.Parse(txtResult.Text))).ToString();
}
private void reci_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = (1.0 / double.Parse(txtResult.Text)).ToString();
}
private void bs_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = txtResult.Text.Remove(txtResult.Text.Length - 1);
if (txtResult.Text.Length == 0)
txtResult.Text = "0";
}
private void C_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = "0";
}
private void Op_Click(object sender, RoutedEventArgs e)
{
lvalue = double.Parse(txtResult.Text);
Button btn = sender as Button;
oper = btn.Content.ToString();
op_after = true;
}
private void Eq_Click(object sender, RoutedEventArgs e)
{
double rvalue = double.Parse(txtResult.Text);
double result = 0;
if (oper == "+")
result = lvalue + rvalue;
else if (oper == "-")
result = lvalue - rvalue;
else if (oper == "×")
result = lvalue * rvalue;
else if (oper == "/")
result = lvalue / rvalue;
txtResult.Text = result.ToString();
}
}
}
Beeeye Dmu
'C# WPF' 카테고리의 다른 글
String 클래스와 StringBuilder 클래스의 차이점 (0) | 2015.12.01 |
---|---|
Stopwatch 사용법 (0) | 2015.11.18 |
[C# WPF] 단위변환기 (0) | 2015.10.21 |
Chart control in WPF (0) | 2015.06.04 |
[C# WPF]Matching Game in WPF, WPF 매칭게임 (1) | 2014.11.26 |