본문 바로가기

C# WPF

[WPF] 시계가 나오는 계산기

시간이 표시되는 간단한 계산기를 만들어 보겠습니다. 이 계산기는 이번 학기 중간고사 시험문제였습니다. 계산기를 만들 수 있는지, 그리고 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