말랑한 하루

[C#] 알람 시계, 타이머 만들기 본문

개발/기타

[C#] 알람 시계, 타이머 만들기

지수는말랑이 2020. 12. 13. 14:43
반응형

시계엔 여러가지종류가있죠

(1) 기본 시계

(2) 알람 시계

(3) 스톱 워치

오늘만들건 알람시계입니다.

알람시계의 기능은 다음처럼 순차적으로 구성할거에요

(1) 시작-멈춤, 재설정, 설정 버튼 만들기

타이머를 시작하고, 멈출수있고, 설정시간을 되돌릴 수 있게 만들거에요

재설정 버튼을 누를 때 설정시간이 안정해져있으면 기본값으로 돌아가게되고,

설정버튼을 누르면 설정시간이 현재시간으로 변하게됩니다.

시간이 전부 흘렀을때도 위와 동일하게 구현할거에요

그리고 시간이 전부 흘렀을때 자동으로 노래가 재생되도록 만들겠슴니당

 

시간을 설정할때 숫자가 아닌 다른입력이나 공백이있으면 안되겠죠?

오류까지 포함해서 예외처리해서 오류메세지를 띄우는것 까지 만들어볼게요!!

 

사실 C# GUI가 처음이었기 때문에 많이헤멨습니당

프로젝트 생성부터 완료까지 작성해보도록할게요~!

Windows Forms 앱으로 솔루션 새로생성합니당

도구상자가 안보이는경우 [보기]-[도구상자] or Ctrl+Alt+X

속성이 안보이는경우 [보기]-[속성] or F4

기본적으로 폼이 하나 생성되어있고,

FormDesign에 대한 내부소스코드를 보고싶을땐 F7을 누르면 간편합니다

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Timer_Example
{
    public partial class Timer : Form
    {
        public Timer()
        {
            InitializeComponent();
        }
    }
}

 

초기코드는 다음과 같아요~! 여기에 위에서말한 기능들을 하나씩 추가해볼게여


※ UI Item 추가

Timer / 타이머추가

[도구상자]-[구성요소]-[Timer] 를 추가합니다. 추가할땐 더블클릭 하시면댐니다.

 

해당 타이머가 1초씩 흘러가게하고 싶으면 Timer의 속성 Interval를 1000으로 변경해주어야합니다!

기본값 100 : 1ms

추가후에 해당 기능에대해서 구현하고 싶을땐 해당 Item을 더블클릭하면 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Timer_Example
{
    public partial class Timer : Form
    {
        public Timer()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

        }
    }
}

 

 

해당 타이머에 대한 함수가생김니다.

위 방식으로 시-분-초를 보여주는 텍스트박스와, 시작-멈춤, 재설정, 설정버튼까지 추가 할게용

 

● TextBox / 텍스트박스 추가

[공용 컨트롤]-[TextBox]

(1) Hour_TextBox (2) Minute_TextBox (3) Sec_TextBox

● Button / 버튼 추가

[공용 컨트롤]-[Button]

(1) Start_Stop_Button (2) ReSet_Button (3) Set_Button

● Label / 라벨 추가

[공용 컨트롤]-[Label]

 


※ 기능구현

일단 기능에필요한 시간 기본설정값, 사용자 설정값, Start_Stop버튼 변환여부에 대한 정보가 필요하므로 선언해줍니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Timer_Example
{
    public partial class Timer : Form
    {
        bool flag = false;
        int time = 600;		// 기본설정값
        int set_time = 600;	// 사용자설정값 (설정안했을시, 기본설정값과 동일하게 설정)
        
        public Timer()
        {
            InitializeComponent();
        }
    }
}

● Start and Stop Button / 시작-멈춤 버튼

시작-멈춤이 대한 flag를 설정해놓고, flag에따라 시작-멈춤이 변동되도록 설정해주기.

 C# TextBox 글자 바꾸기

여러가지방법이있지만 여기서는 문자를 직접 넣거나, 숫자를 string으로 변경해서 넣어야함니다. 기본이필요한 방식!

TextBox.Text = "centense";
TextBox.Text = value.ToString();

위 두가지방식이 필요합니당~! 이를적용해서 시작-멈춤버튼의 기능을 구현하면 다음과같이됩니당

private void Start_Stop_Click(object sender, EventArgs e)
{
    if (flag == false)
    {
        timer1.Start();		// 타이머 시작
        flag = true;
        Start_Stop.Text = "Stop";
    }
    else
    {
        timer1.Stop();		// 타이머 멈춤
        flag = false;
        Start_Stop.Text = "Start";
    }
}

● Set / 설정 버튼

설정버튼을 누를때, 현재시간을 가져와야합니다.

타이머가 멈춰있던 멈춰있지않던 버튼을 눌렀을때 텍스트의 값만 가져오면 되므로 간단하게구현합니다

set_time += Convert.ToInt32(Hour_TextBox.Text)*3600;	// 시간
set_time += Convert.ToInt32(Min_TextBox.Text)*60	// 분
set_time += Convert.ToInt32(Sec_TextBox.Text);		// 초

보기쉽게 분할해놨슴니당.

하지만 이때, 사용자가 입력시에 공백, 특수문자, 음수가 입력될 수 있기에 이를 예외처리해줍니다

이를위해 다음방법들이 필요합니다.

◎ C# TextBox에서 숫자 추출하기

Convert.ToInt32(*TextBox_name*)

C# TextBox에서 숫자만 존재하는지 판별하기

int index = 0;
int.TryParse(*TextBox_name*, out index);
// 0~TextBox_name의 길이까지 돌며 숫자가 존재하는지 판별
// 숫자만 존재한다면 return true, 이외의 문자가 존재한다면 return false

위를이용해 예기치않은 예외, 문자나 공백이입력될때, 음수가입력될때를 제외해줍니다

 private void Set_Click(object sender, EventArgs e)
{
    int i = 0, j = 0, k = 0;
    try
    {
        if (!int.TryParse(Hour_TextBox.Text, out i) ||
            !int.TryParse(Minute_TextBox.Text, out j) ||
            !int.TryParse(Sec_TextBox.Text, out k))
        {
            
        }
        else
        {
            if (Convert.ToInt32(Hour_TextBox.Text) < 0 ||
                Convert.ToInt32(Minute_TextBox.Text) < 0 ||
                Convert.ToInt32(Sec_TextBox.Text) < 0)
            {
                
            }
            else
            {
            
            }
        }
    }
    catch (Exception ex)
    {
    
    }
}

 C# MessageBox 출력, 옵션설정(문구, 제목, 버튼, 아이콘)

문구와 제목은 사용자지정으로 설정가능합니다.

기본형식은 다음과같고, OK와 Warning의경우 아래정보로 필요에따라 변경하실 수 있슴니다!

MessageBox.Show(string, string, MessageBoxButtons.OK, MessageBoxIcon.Warning);
더보기

(3) 버튼
AbortRetryIgnore : 중단, 다시시도, 무시 버튼 표시
OK : 확인 버튼 표시 
OKCancel : 확인, 취소 버튼 표시 
RetryCancel : 다시 시도, 취소 버튼 표시 
YesNo : 예, 아니요 버튼 표시 
YesNoCancel : 예, 아니요, 취소 버튼 표시

더보기

(4) 아이콘
Asterisk : 정보 아이콘 
Error : 빨간색 원 안 X 표시 
Exclamation : 경고 아이콘 
Hand : 손바닥 아이콘 
Information : 정보 아이콘
None : 아이콘을 표시하지 않음 
Question : 물음표 아이콘 
Stop : 빨간색 원 안 X 표시 
Warning : 경고 아이콘

그래서 위를 적용해서 제맘대로 넣어봤슴니다~! 위정보통해서 변경하시면됨니당

예기치않은처리는 Try_catch이용해서 처리했습니당

 private void Set_Click(object sender, EventArgs e)
{
    int i = 0, j = 0, k = 0;
    try
    {
        if (!int.TryParse(Hour_TextBox.Text, out i) ||
            !int.TryParse(Minute_TextBox.Text, out j) ||
            !int.TryParse(Sec_TextBox.Text, out k))
        {
            MessageBox.Show("숫자만 입력해 주세요", "Warning !", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
        }
        else
        {
            if (Convert.ToInt32(Hour_TextBox.Text) < 0 || 
            Convert.ToInt32(Minute_TextBox.Text) < 0 || 
            Convert.ToInt32(Sec_TextBox.Text) < 0)
            {
                MessageBox.Show("음수는 입력하지 말아주세요", "Warning !", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
            }
            else
            {
                set_time = Convert.ToInt32(Hour_TextBox.Text) * 3600 + Convert.ToInt32(Minute_TextBox.Text) * 60 + Convert.ToInt32(Sec_TextBox.Text);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("\n예기치않은 오류입니다\n다시시도해주세요" + ex.ToString(), "Exception Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
    }
}

● ReSet Button / 재설정 버튼

재설정버튼은 설정 버튼을 눌렀을때 저장된 값을 불러와서 시-분-초로 분할 후 Text에 적용시켜주면됩니다

private void ReSet_Click(object sender, EventArgs e)
{
    Hour_TextBox.Text = (set_time / 3600).ToString();
    Minute_TextBox.Text = ((set_time % 3600) / 60).ToString();
    Sec_TextBox.Text = (set_time % 60).ToString();
    time = set_time;
}

 

버튼에 대한 기능구현이 끝났으므로 마지막으로 Timer기능만 구현하면됩니다~!

시간은 1초씩줄어들고, 줄어들때마다 텍스트박스가 변하게끔 설정하면됩니당.

시간이 종료되었을 때, 타이머를 멈추는것 까지 구현하게되면 다음처럼 할 수 있어용

● Timer / 타이머

private void timer1_Tick(object sender, EventArgs e)
{
    Hour_TextBox.Text = (time / 3600).ToString();
    Minute_TextBox.Text = ((time % 3600) / 60).ToString();
    Sec_TextBox.Text = (time % 60).ToString();
    if (time == 0)
    {
        timer1.Stop();
        Start_Stop_Button.Text = "Start";
        flag = false;
        time = set_time;	// 사용자가 설정한시간으로 시간 초기화, 미설정시 기존값 복원
    }
    time--;
}

마지막으로 시간이 종료되었을 때 음악이 재생되도록 해야해요~!

노래만 나오게하고싶을땐 wav 파일을, mp3가 재생되도록할땐 MediaPlayer를 사용하게되는데

간단하게 노래만나오게 하고싶으므로 wav파일로 하겠슴니다~!

 

● C# 노래 자동 재생기능 (wav)

 C# Media(Wav) 재생하기

정말 다양한방법들이 존재합니다~!

단, 절대경로의경우 자신의컴퓨터에서만 실행되도록 설정되는 경우가 많기때문에 이는 비추천드립니다.

맨처음에 절대경로로 지정했다가 Application.StartupPath 등의 리턴값이 정확히 어딘지 알 수 없어서 헤멨어요ㅠ

꼭 프로젝트파일 (Timer_Example-bin-Debug) 하위경로에 파일을 넣어주셔야 다음이 정상적으로 실행됩니다~!

4개중에 1개 사용해주시면됨니다

SoundPlayer simpleSound = new SoundPlayer(Application.StartupPath + @"\example.wav");
SoundPlayer simpleSound = new SoundPlayer(System.Environment.CurrentDirectory + @"\example.wav");
SoundPlayer simpleSound = new SoundPlayer(System.IO.Directory.GetCurrentDirectory() + @"\example.wav");
SoundPlayer simpleSound = new SoundPlayer(@"C:\Users\user\~\example.wav");	// 절대경로

이후 시간이 0초가될때 음악시작, reset버튼을 누를때 음악종료! 가되도록 설정해주시면되요

다음은 전체 소스코드입니다. 도움이되셧길 바라고~! 나중에 시간이되면 새로운것도 만들어볼게용

더보기
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Media;
using System.Timers;

namespace Timer_Example
{
    public partial class Timer : Form
    {
        bool flag = false;
        int time = 600;
        int set_time = 600;

        SoundPlayer simpleSound = new SoundPlayer(Application.StartupPath + @"\example.wav");
        //SoundPlayer simpleSound = new SoundPlayer(System.Environment.CurrentDirectory + @"\example.wav");
        //SoundPlayer simpleSound = new SoundPlayer(System.IO.Directory.GetCurrentDirectory() + @"\example.wav");
        //SoundPlayer simpleSound = new SoundPlayer(@"C:\Users\user\~\example.wav");

        public Timer()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Hour_TextBox.Text = (time / 3600).ToString();
            Minute_TextBox.Text = ((time % 3600) / 60).ToString();
            Sec_TextBox.Text = (time % 60).ToString();
            if (time == 0)
            {
                timer1.Stop();
                Start_Stop_Button.Text = "Start";
                flag = false;
                time = set_time;
                simpleSound.Play();
            }
            time--;
        }

        private void Start_Stop_Click(object sender, EventArgs e)
        {
            if (flag == false)
            {
                timer1.Start();
                flag = true;
                Start_Stop_Button.Text = "Stop";
            }
            else
            {
                timer1.Stop();
                flag = false;
                Start_Stop_Button.Text = "Start";
            }
        }

        private void ReSet_Click(object sender, EventArgs e)
        {
            Hour_TextBox.Text = (set_time / 3600).ToString();
            Minute_TextBox.Text = ((set_time % 3600) / 60).ToString();
            Sec_TextBox.Text = (set_time % 60).ToString();
            time = set_time;

            simpleSound.Stop();
        }

        private void Set_Click(object sender, EventArgs e)
        {
            int i = 0, j = 0, k = 0;
            try
            {
                if (!int.TryParse(Hour_TextBox.Text, out i) || !int.TryParse(Minute_TextBox.Text, out j) || !int.TryParse(Sec_TextBox.Text, out k))
                {
                    MessageBox.Show("숫자만 입력해 주세요", "Warning !", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                }
                else
                {
                    if (Convert.ToInt32(Hour_TextBox.Text) < 0 || Convert.ToInt32(Minute_TextBox.Text) < 0 || Convert.ToInt32(Sec_TextBox.Text) < 0)
                    {
                        MessageBox.Show("음수는 입력하지 말아주세요", "Warning !", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
                    }
                    else
                    {
                        set_time = Convert.ToInt32(Hour_TextBox.Text) * 3600 + Convert.ToInt32(Minute_TextBox.Text) * 60 + Convert.ToInt32(Sec_TextBox.Text);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("\n예기치않은 오류입니다\n다시시도해주세요" + ex.ToString(), "Exception Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
            }
        }
    }
}
반응형

'개발 > 기타' 카테고리의 다른 글

[MapleSpy] 개인정보처리방침  (0) 2024.01.10
Comments