C# WPF를 이용하여 계산기 프로그램 만들기 기능 구현 마지막입니다.
지금까지 했던 코드들을 세세하게 적어보려고 합니다.
1. XAML 소스 코드
- 아래의 사진은 계산기 UI 입니다.
1-(1) 줄칸 구현
<!--소스 코드-->
<Window x:Class="cal.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:cal"
mc:Ignorable="d"
Title="MainWindow" Height="628.153" Width="406.745">
<Grid HorizontalAlignment="Left" Width="404" Margin="0,0,-5,-1">
<!--Row Definition 총 5줄 구현-->
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="75"/>
<RowDefinition Height="75"/>
<RowDefinition Height="75"/>
<RowDefinition Height="75"/>
<RowDefinition Height="75"/>
</Grid.RowDefinitions>
<!--Column Definition 총 4칸 구현-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
1-(2) 계산기 현황값 구현(계산기의 결과값을 출력해주는 부분)
- 결과값은 아래의 사진에서 레드박스를 말합니다.
- 계산기의 결과값을 나타내기 위해 Label을 정의하여 사용합니다.
<!--Label을 정의하고, Label의 Name은 resultLabel로 정의합니다.
Grid.ColumnSpan을 사용하여 4칸을 합쳐서 Label을 정의를 해줍니다.
Grid.Row는 줄의 위치를 말함.
HorizontalContentAlignment="Right"와 VerticalContentAlignment="Bottom"을 사용하여 결과값을
우측 하단에 위치하도록 만들어 줍니다. -->
<!--소스 코드-->
<Label x:Name="resultLabel"
Content="0"
Grid.ColumnSpan="4"
Grid.Row="0"
HorizontalContentAlignment="Right"
VerticalContentAlignment="Bottom"
FontSize="100"/>
1-(3) 숫자 버튼 구현
<!-- 각 버튼에 대한 Name을 NButton으로 정의해주고, Column과 Row에 맞게 배치를 해줍니다.
위의 UI와 맞게 설정을 해주고, 버튼을 클릭했을 때의 이벤트 함수를 정의하여 줍니다.-->
<--소스 코드-->
<!-- 숫자 버튼 0 -->
<Button x:Name="ZeroButton"
Grid.Column="0"
Grid.Row="5"
Content="0"
Margin="5,5,5,-13"
Grid.ColumnSpan="2"
Foreground="white"
Background="Gray"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 1 -->
<Button x:Name="OneButton"
Grid.Column="0"
Grid.Row="4"
Content="1"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 2 -->
<Button x:Name="TwoButton"
Grid.Column="1"
Grid.Row="4"
Content="2"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 3 -->
<Button x:Name="ThreeButton"
Grid.Column="2"
Grid.Row="4"
Content="3"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 4 -->
<Button x:Name="FourButton"
Grid.Column="0"
Grid.Row="3"
Content="4"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 5 -->
<Button x:Name="FiveButton"
Grid.Column="1"
Grid.Row="3"
Content="5"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 6 -->
<Button x:Name="SixButton"
Grid.Column="2"
Grid.Row="3"
Content="6"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 7 -->
<Button x:Name="SevenButton"
Grid.Column="0"
Grid.Row="2"
Content="7"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
<!-- 숫자 버튼 8 -->
<Button x:Name="EightButton"
Grid.Column="1"
Grid.Row="2"
Content="8"
Foreground="white"
Background="Gray"
FontSize="30"
Margin="5,5,5,5"
Click="numberButton_Click"/>
<!-- 숫자 버튼 9 -->
<Button x:Name="NineButton"
Grid.Column="2"
Grid.Row="2"
Content="9"
Foreground="white"
Background="Gray"
Margin="5,5,5,5"
FontSize="30"
Click="numberButton_Click"/>
1-(4) AC, +/-, %, ., = 버튼 구현
<!--숫자 버튼과 같이, 버튼의 Name을 정의하고 설정에 맞게 코딩을 해줍니다.
AC, +/-, %, ., = 버튼은 숫자와 Operation과는 따로 분리하였습니다.
Operation과 숫자 버튼처럼 하나의 이벤트 함수로 관리를 할 수 있지만,
비교를 위해 수정을 안했습니다.-->
<!--소스 코드-->
<!--연산버튼 AC-->
<Button x:Name="AcButton"
Grid.Column="0"
Grid.Row="1"
Content="AC"
FontSize="30"
Margin="5,5,5,5"
Click="AcButton_Click"/>
<!-- 연산버튼 Plus/Minus -->
<Button x:Name="PlusMinusButton"
Grid.Column="1"
Grid.Row="1"
Content="+/-"
FontSize="30"
Margin="5,5,5,5"
Click="PlusMinusButton_Click"/>
<!-- 연산버튼 Percent -->
<Button x:Name="PercentButton"
Grid.Column="2"
Grid.Row="1"
Content="%"
FontSize="30"
Margin="5,5,5,5"
Click="PercentButton_Click"/>
<!-- 연산버튼 Dot -->
<Button x:Name="DotButton"
Grid.Column="2"
Grid.Row="5"
Content="."
Foreground="white"
Background="Gray"
FontSize="30"
Margin="5,5,5,-13"
Click="DotButton_Click"/>
<!-- 연산버튼 Equl -->
<Button x:Name="EqulButton"
Grid.Column="3"
Grid.Row="5"
Content="="
Background="Green"
Margin="5,5,5,-13"
FontSize="30"
Click="EqulButton_Click"/>
1-(5) 연산 버튼(Operation Button) 구현
<!--연산 기호인 덧셈, 뺄셈, 나눗셈, 곱셈에 대한 Button과 이벤트 함수 정의입니다.
여기서 이벤트 함수는 operationButton_Click으로 사용을 했습니다.-->
<!--소스 코드->
<!-- 연산버튼 Divide -->
<Button x:Name="DivideButton"
Grid.Column="3"
Grid.Row="1"
Content="/"
Background="Green"
Margin="5,5,5,5"
FontSize="30"
Click="operationButton_Click"/>
<!-- 연산버튼 Multiple -->
<Button x:Name="MultipleButton"
Grid.Column="3"
Grid.Row="2"
Content="*"
Background="Green"
Margin="5,5,5,5"
FontSize="30"
Click="operationButton_Click"/>
<!-- 연산버튼 Minus -->
<Button x:Name="MinusButton"
Grid.Column="3"
Grid.Row="3"
Content="-"
Background="Green"
Margin="5,5,5,5"
FontSize="30"
Click="operationButton_Click"/>
<!-- 연산버튼 Plus -->
<Button x:Name="PlusButton"
Grid.Column="3"
Grid.Row="4"
Content="+"
Background="Green"
Margin="5,5,5,5"
FontSize="30"
Click="operationButton_Click"/>
2. CS 소스 코드
2-(1) 정의 부분
<!--소스 코드-->
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace cal
{
///
/// MainWindow.xaml에 대한 상호 작용 논리
///
public partial class MainWindow : Window
{
double lastNumber; //연산할 때 앞에 입력한 값을 저장하는 변수
SelectedOperator selectedOperator;
double result; // 연산한 결과 값을 저장하는 변수
public MainWindow()
{
InitializeComponent();
//각 버튼에 대한 이벤트 함수를 안만들고 아래와 같이 해도 상관 없음.
//AcButton.Click += AcButton_Click;
}
2-(2) enum을 이용하여 SelectedOperator.XXX 를 사용하기 위해 선언
public enum SelectedOperator
{
Addition,
Subtraction,
Multiplication,
Division
}
2-(3) 연산에 대한 클래스 (SimpleMath)
public class SimpleMath
{
public static double Add(double n1, double n2)
{
return n1 + n2;
}
public static double Subtract(double n1, double n2)
{
return n1 - n2;
}
public static double Multiple(double n1, double n2)
{
return n1 * n2;
}
public static double Divide(double n1, double n2)
{
return n1 / n2;
}
}
2-(4) 숫자 버튼에 대한 이벤트 함수
// 아래의 이벤트 함수를 쓰려면 xaml에서 Click="numberButton_Click"으로 해줘야 함
// sender를 활용하여 sender가 각 버튼에 대한 Name일 때 적용
// selectedValue를 사용하여 resultLabel(계산기 결과값)에 적용
private void numberButton_Click(object sender, RoutedEventArgs e)
{
//MessageBox.Show("버튼 눌림");
int selectedValue = 0;
if (sender == ZeroButton)
{
selectedValue = 0;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == OneButton)
{
selectedValue = 1;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == TwoButton)
{
selectedValue = 2;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == ThreeButton)
{
selectedValue = 3;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == FourButton)
{
selectedValue = 4;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == FiveButton)
{
selectedValue = 5;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == SixButton)
{
selectedValue = 6;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == SevenButton)
{
selectedValue = 7;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == EightButton)
{
selectedValue = 8;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
if (sender == NineButton)
{
selectedValue = 9;
if (resultLabel.Content.ToString() == "0")
{
resultLabel.Content = selectedValue.ToString();
}
else
{
resultLabel.Content += selectedValue.ToString();
}
}
}
// Plus, Minus, Multiple, Divide 4개가 있는 이벤트 함수
private void operationButton_Click(object sender, RoutedEventArgs e)
{
lastNumber = double.Parse(resultLabel.Content.ToString());
resultLabel.Content = "0";
/*if(double.TryParse(resultLabel.Content.ToString(),out lastNumber))
{
resultLabel.Content = "0";
}
*/
2-(5) 연산 버튼에 대한 이벤트 함수
if(sender == PlusButton)
{
selectedOperator = SelectedOperator.Addition;
}
if (sender == MinusButton)
{
selectedOperator = SelectedOperator.Subtraction;
}
if (sender == MultipleButton)
{
selectedOperator = SelectedOperator.Multiplication;
}
if (sender == DivideButton)
{
selectedOperator = SelectedOperator.Division;
}
}
2-(6) 이외의 버튼에 대한 이벤트 함수
// AC 버튼 클릭
private void AcButton_Click(object sender, RoutedEventArgs e)
{
resultLabel.Content = "0";
}
// PlusMinus 버튼 클릭
private void PlusMinusButton_Click(object sender, RoutedEventArgs e)
{
double lastNumber;
if(double.TryParse(resultLabel.Content.ToString(), out lastNumber))
{
lastNumber = lastNumber * -1;
resultLabel.Content = lastNumber.ToString();
}
}
// Percent 버튼 클릭
private void PercentButton_Click(object sender, RoutedEventArgs e)
{
double lastNumber;
if (double.TryParse(resultLabel.Content.ToString(), out lastNumber))
{
lastNumber = lastNumber * 0.01;
resultLabel.Content = lastNumber.ToString();
}
}
// Dot 버튼 클릭
private void DotButton_Click(object sender, RoutedEventArgs e)
{
Boolean a;
a = resultLabel.Content.ToString().Contains(".");
if (resultLabel.Content.ToString() == "0")
{
return;
}
else
{
if(a==false)
{
resultLabel.Content += ".";
}
}
}
// Equl 버튼 클릭
private void EqulButton_Click(object sender, RoutedEventArgs e)
{
double newNumber;
newNumber = double.Parse(resultLabel.Content.ToString()); // 연산자 후 숫자 저장
switch(selectedOperator)
{
case SelectedOperator.Addition:
result = SimpleMath.Add(lastNumber, newNumber);
break;
case SelectedOperator.Subtraction:
result = SimpleMath.Subtract(lastNumber, newNumber);
break;
case SelectedOperator.Multiplication:
result = SimpleMath.Multiple(lastNumber, newNumber);
break;
case SelectedOperator.Division:
result = SimpleMath.Divide(lastNumber, newNumber);
break;
}
resultLabel.Content = result.ToString();
}
3. 결과
'Language > C# WPF Programming' 카테고리의 다른 글
C# WPF 프로그래밍 유저 컨트롤(User Control) 구현하기 (0) | 2019.04.23 |
---|---|
C# WPF 프로그래밍 툴바(Tool Bar)구현 (0) | 2019.04.22 |
C# WPF 프로그래밍 SubWindow 생성 구현하기 (0) | 2019.04.21 |
C# WPF 프로그래밍 콤보박스(Combo Box) 구현 (0) | 2019.04.20 |
C# WPF 프로그래밍 TreeView 아이템 컨트롤 구현하기 (0) | 2019.04.19 |
C# WPF 프로그래밍 탭 컨트롤(Tab Control) 구현하기 (0) | 2019.04.18 |
C# WPF 프로그래밍 메뉴(Menu) 아이템 컨트롤 구현하기 (0) | 2019.04.17 |
C# WPF 프로그래밍 아이템 컨트롤 리스트 박스(list box)구현 (0) | 2019.04.16 |
최근댓글