C#을 이용한 프로그램을 하나씩 올려보려고 합니다
우선 첫번째로 간단하게 만들 수 있는 스탑워치를 만들어보겠습니다.
완성 프로그램 다운로드
1. 프로젝트 생성하기
File > New > Project 를 선택해서 새로운 프로젝트를 생성합니다.
왼쪽 트리창에서 Visual C#이 선택된 것을 확인하고, Windows를 선택하면 오른쪽에서 windows form appliciation 템플릿을 선택할 수 있습니다.
선택 후 프로젝트 이름과 프로젝트를 생성할 경로를 설정하고 OK를 누르면 프로젝트 생성 끝!
2. 폼 디자인 꾸미기
이제 스탑워치의 시간을 나타낼 부분과 시작/멈춤 버튼을 만들어야 합니다.
Toolbox에서 Lable을 끌어다가 폼에 올려놓습니다.
그리고 이 Lable의 이름을 변경해주어야 하는데요, 기본적으로 Lable1 이라는 이름으로 컨트롤이 생성되는데, Lable1, Lable2... 이런식으로 컨트롤을 많이 만들면 나중에 헷갈리게되니까...
lable인 경우 lb_목적 TextBox의 경우 tb_목적 과 같은 방식으로(혹은 자기만의 방식으로) 컨트롤의 이름을 생성하면 됩니다.
우선 저는 시간을 나타낼 레이블은 lb_hour 라고 만들었습니다. "분"과 "초"를 나타낼 레이블도 만들어야겠죠? 물론 이름은 lb_min, lb_sec 입니다.
컨트롤의 이름(Name)을 바꾸더라도 컨트롤에 적혀있는 글씨(Text)은 바뀌지 않는데요 이걸 또 바꿔야겠죠?
프로그램을 켰을 때 label1 label2 label3 이라고 나오는 것 보단 스탑워치 답게 0 : 0 : 0 과 같은 식으로 나오면 좋겠죠?
lb_hour를 선택한 다음 properties 창에서 Text값을 찾은 후 아래와 같이 바꿔줍니다
lb_hour.Text : "0"
lb_min.Text : "0"
lb_sec.Text : "0"
그리고 글씨가 좀 컸으면 좋겠군요...font size를 크게 만들고싶군요...
properties창에서 [+]Font 라는 녀석을 찾아서 [+]를 클릭하면 Size가 나옵니다.
그냥 Size는 Label 컨트롤 자체의 크기를 의미하기 때문에 글씨크기는 커지지 않습니다.(영역만 넓어진다는 뜻이지요)
그리고 label을 두 개 더 추가해서 ":" 이 녀석을 나타내주면.....
이제 폼은 이런 모양을 하고있겠죠?
그러니가...여기선...label이 다섯개가 있는거죠?
아..버튼이 어디서 났냐구요?-_-;; 잘 생각해서 버튼도 두 개 추가해주세요
저는 bt_start, bt_stop 이라는 이름으로 버튼을 생성했습니다.
3. 프로그램에 숨불어넣기!
이제 프로그램에 숨을 불어넣을 차례입니다. 스탑워치를 만들려면.. 시간을 측정하는 녀석이 필요하겠군요. 바로 Timer라는 녀석인데요.. ToolBox에서 Timer 라는 녀석을 찾아서 폼에 드래그&드롭합니다. 그러면..폼에 아무것도 안생기죠? 하지만 폼 아래에 보면 스탑워치같이 생긴 녀석 하나가 나타날겁니다.
Timer라는 녀석을 선택해보면 Properties 창에 Timer에 대한 속성이 나오는데요..
우리가 여기서 주목해야 할 것은 Enabled와 Interval 입니다.
프로그램이 시작하자마자 스톱워치가 동작하는게 아니라, Start 버튼을 누르면 스톱워치가 동작하게 할 거니까... 우선 이녀석은 비활성화시켜야겠군요 그렇다면 Timer1.Enabled = false로 해 두죠.
(제가 아까부터 Timer1.Enabled 라던지..lb_hour.Text 라던지... (.)을 이용해서 속성을 이야기 하는데.. 이는 실제로 나중에 코드를 입력할 때 사용되는 방식입니다. 이따 다시 설명드리겠습니다.)
그리고 Interval이라는 녀석! 이벤트가 발생하는 시간단위를 말하는데요... 우리는 1초에 한 번씩 시간이 바뀌도록 하는 스탑워치를 만들거니까... Timer1.Interval = 1000; 이라고 설정합니다.(1000ms = 1초..가 되는거죠)
자...이제 제대로 코드를 짜볼까요?
폼 아랫부분의 시계모양(timer1)을 더블클릭하면, 1초에 한번씩 어떤 일을 할건지를 명령하는 코드를 입력하게 됩니다.
여기에 아래와 같이 넣어봅시다.
코드를 보면...
lb_sec.Text = (~~~) --> lb_sec라는 녀석의 Text를 (~~~)로 바꾸어라!라는건 알겠죠?
하지만 우변을 보면 조금 난해합니다...
(Convert.ToInt32(lb_sec.Text) + 1).ToString();
부분 부분 나눠서 보면...
Convert.ToInt32(lb_sec.Text) >>lb_sec의 Text값(초기값 = 0으로 설정해줬죠?)을 32비트의 정수형으로 변환하여라. Label에 보여지는 값은 정수형이 아니라 문자열(string)형태입니다. 이 녀석을 1초에 한 번씩 1씩 더하기를 하려면, 정수형으로 변환할 필요가 있겠죠. 그래서 Convert.ToInt32() 라는 녀석을 쓰는 겁니다.
그러면 이제 Label에 들어있던 녀석은 문자열 "0" 에서 정수형 0 으로 바뀌었습니다.
이젠 여기다가 +1 을 해줄 수 있겠죠?
마지막 ToString() 이 의미하는 것은 쉽게 유추가 되죠? label의 text에는 문자열만 들어갈 수 있는데, 지금 연산한 값은 정수형이니까...이 정수형 값을 다시 문자열로 바꾸는 역할을 해주는 함수입니다.
0. lb_sec에 입력된 값(문자열 "0")을 불러온다.
1. 문자열 "0"을 정수형 0으로 변환한다.
2. 변환된 정수형 값 0에 1을 더한다.
3. 1이 더해진 정수형 값을 다시 문자열로 변환한다.
4. lb_sec에 연산된 값을 입력한다.
하지만 프로그램을 실행(F5)해보면.. 아무런 변화가 없는데요...
아까 timer1.Enabled = false; 라고 설정해두었으니...방금 입력한 명령이 실행되지 않는 것입니다.
다시 폼 디자인하는 창으로 넘어가서 시작버튼(bt_start)를 더블클릭 해서 버튼에 명령을 입력합니다.
이제 실행(F5)해서 시작버튼을 눌러보면..1초에 한 번씩 초가 증가하는 것을 알 수 있습니다.
그렇다면...60초가 되면 lb_min이 1씩 증가하고, lb_sec는 다시 0으로 돌아오는 알고리즘을 넣어야겠군요!!
timer1에 입력된 명령을 수정해볼까요?
이제 다시 실행해보면 60초가 되면 lb_sec.Text=0으로, lb_min은 +1씩 증가하는 것을 확인할 수 있습니다.
(1분 기다리지 마시구요...timer1.Interval = 10 정도로 짧게 하시면 0.01초에 한 번씩 1초가 증가하는 걸 확인할 수 있습니다^_^)
그럼 이제 마지막으로... lb_min이 60분이 되면 0으로 바뀌고 한 시간 증가하도록 코드를 짜고 완성시켜보죠!