반응형

안녕하세요, 츄르 사려고 코딩하는 집사! 코집사입니다.

C# WPF를 이용하여 계산기 프로그램 만들기 기능 구현 마지막입니다.

지금까지 했던 코드들을 세세하게 적어보려고 합니다.

 

1. XAML 소스 코드

   - 아래의 사진은 계산기 UI 입니다.

계산기 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. 결과

 

9*8을 하면 결과값에 72가 출력

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기