7. 타이머

Download Report

Transcript 7. 타이머

7장. 타이머
7. 타이머
7.1 타이머로 스탑워치 만들기
타이머를 이용한다.
시작을 누르면 정지를 누를 때까지 카운트 시간을 표시한다.
7. 타이머

실습 20
1.
새로 MFC 응용프로그램 프로젝트를 생성한다. (이름 : Timer)
2.
응용프로그램 종류를 [대화 상자 기반]으로,
[유니코드 라이브러리 사용]을 체크 해제한다.
3.
화면에 있는 컨트롤들을 삭제하여 깨끗하게 한다.
7. 타이머
4. 아래와 같이 에디터상자 와 버튼들을 만든다.
IDC_EDIT1
IDC_BUTTON1
IDC_BUTTON2
IDC_BUTTON3
7. 타이머
5. 클래스 마법사를 실행하고 IDC_EDIT1에 대해 멤버 변수를
만든다.
m_Edit
7. 타이머
6. 아래와 같이 메시지 항목에서 WM_TIMER 에 대해 처리기
추가를 하고, 코드 편집을 클릭한다.
7. 타이머
7. 코드 창에 아래 코드를 입력한다.
void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
char str1[100];
static int nCho=1, nBun=0;
sprintf(str1, "%d분 %d초 경과", nBun, nCho);
m_Edit = str1;
UpdateData(FALSE);
nCho = nCho + 1;
if(nCho == 60)
{
nCho = 1;
nBun = nBun + 1;
}
}
초를 1 씩 증가한다.
만약 60초면 분을 1 증가한다.
CDialogEx::OnTimer(nIDEvent);
7. 타이머
8. 시작 버튼, 정지 버튼을 각각 더블 클릭하고 아래 코드를 입
력한다.
void CTimerDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
SetTimer(1, 1000, NULL);
Timer ID 1번, 1초마다
WM_TIMER (OnTimer함수) 호출
}
void CTimerDlg::OnBnClickedButton2()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
KillTimer(1);
}
Timer ID 1번 제거
7. 타이머
9.
종료 버튼을 더블 클릭하고 아래 코드를 추가한다.
void CComboDlg::OnClickedButton3()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
OnOK();
다이얼로그 상자 종료
}
9.
실행 후 결과를 확인해 본다.
7. 타이머

실습 21
앞의 실습 20에서 에디터 상자를 삭제하고 코드를 변경하여
다음과 같이 만들어 본다.
7. 타이머
void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
char str1[100];
static int nCho=1, nBun=0;
sprintf(str1, "%d : %d", nBun, nCho);
CClientDC dc(this);
지난 주 강의를 참조하여 코드를 만들어 볼 것
dc.TextOut(140,50,str1);
nCho = nCho + 1;
if(nCho == 60)
{
nCho = 1;
nBun = nBun + 1;
}
}
CDialogEx::OnTimer(nIDEvent);
7. 타이머
7.2 타이머로 움직이는 텍스트 만들기
시작을 누르면 정지를 누를 때까지 텍스트가 사각형을
그리며 움직인다.
7. 타이머

실습 22
1.
새로 MFC 응용프로그램 프로젝트를 생성한다. (이름 : Move)
2.
응용프로그램 종류를 [대화 상자 기반]으로,
[유니코드 라이브러리 사용]을 체크 해제한다.
3.
화면에 있는 컨트롤들을 삭제하여 깨끗하게 한다.
7. 타이머
4. 아래와 같이 시작, 정지 버튼과 종료 버튼을 만든다.
IDC_BUTTON1
IDC_BUTTON2
IDC_BUTTON3
7. 타이머
5. 시작 버튼, 정지 버튼을 각각 더블 클릭하고 아래 코드를 입
력한다.
void CTimerDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
SetTimer(1, 10, NULL);
Timer ID 1번, 0.01초마다
WM_TIMER (OnTimer함수) 호출
}
void CTimerDlg::OnBnClickedButton2()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
KillTimer(1);
}
Timer ID 1번 제거
7. 타이머
6. 아래와 같이 메시지 항목에서 WM_TIMER 에 대해 처리기
추가를 하고, 코드 편집을 클릭한다.
7. 타이머
7. 코드 창에 아래 코드를 입력한다.
void CMoveDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
static int nX=1, nY=1, nStop=1;
InvalidateRect(NULL, TRUE);
UpdateWindow();
윈도우를 지우고 갱신한다.
dc.TextOut(nX, nY, “움직이는 텍스트”);
if(nStop == 1)
nX = nX + 1;
if(nX == 400)
nStop = 2;
if(nStop == 2)
nY = nY + 1;
코드 계속
X좌표값을 1씩 증가한다.
만약 X좌표값이 400 이면
Y좌표값을 1씩 증가한다.
7. 타이머
코드 계속
if(nY == 300)
nStop = 3;
if(nStop == 3)
nX = nX - 1;
if(nX == 1)
nStop = 4;
if(nStop == 4)
nY = nY - 1;
if(nY == 1)
nStop = 1;
}
CDialogEx::OnTimer(nIDEvent);
만약 Y좌표값이 300 이면
X좌표값을 1씩 감소한다.
만약 X좌표값이 1 이면
Y좌표값을 1씩 감소한다.
7. 타이머
8.
종료 버튼을 더블 클릭하고 아래 코드를 추가한다.
void CComboDlg::OnClickedButton3()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
OnOK();
다이얼로그 상자 종료
}
9.
실행 후 결과를 확인해 본다.
연습문제
앞의 실습 22를 움직이는 텍스트 대신에 공이 움직이도록 변경해 볼 것.
힌트 : 아래 참조
공크기
dc.Ellipse( nX, nY, nX+30, nY+30 );
속도조절
SetTimer(1, 10, NULL);
(nX, nY)
dc.TextOut( nX, nY ……. ) 대신 사용
(nX+30, nY+30)
7. 타이머
7. 타이머
7.3 화살로 사과 맞추기 게임 만들기
Start를 누르면 사과가 떨어지고, 아무데나 클릭하면 화살이
날아간다.
7. 타이머

실습 23
1.
새로 MFC 응용프로그램 프로젝트를 생성한다. (이름 : Apple)
2.
응용프로그램 종류를 [대화 상자 기반]으로,
[유니코드 라이브러리 사용]을 체크 해제한다.
3.
화면에 있는 컨트롤들을 삭제하여 깨끗하게 한다.
약간 크게 늘린다.
7. 타이머
4. 리소스 뷰의 Icon을 우측 클릭하고 리소스 추가에서 Icon –
가져오기를 클릭한다.
7. 타이머
5. 아이콘 파일을 2개 ( Apple.ico, Arrow.ico )를 순서대로 추가한다.
강의 게시판에서
다운받을 것
IDI_ICON1
IDI_ICON2
-> Apple.ico
-> Arrow.ico
7. 타이머
6. 아래와 같이 Start, Stop 버튼을 만든다.
IDC_BUTTON1
IDC_BUTTON2
7. 타이머
7. 클래스 마법사을 실행하고 멤버 변수를 클릭한 다음 [사용자 지정
추가] 를 클릭해 int 형으로 m_temp1 과 m_temp2 를 만든다.
m_temp1
직접 입력
m_temp2
직접 입력
7. 타이머
8. 마찬가지로 [사용자 지정 추가] 를 클릭해 int 형으로 x 와 y 를 만
든다.
y
x
m_temp1
m_temp2
x
y
->
->
->
->
사과의 위치값 저장을
화살의 위치값 저장을
점수를 저장하기 위한
실행 횟수를 저장하기
위한 변수
위한 변수
변수
위한 변수
7. 타이머
9. Start 버튼, Stop 버튼을 각각 더블 클릭하고 아래 코드를
입력한다.
void CAppleDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
SetTimer(1, 200, NULL);
SetTimer(2, 200, NULL);
x = 0;
화살에 대한 타이머 (속도)
사과에 대한 타이머 (속도)
점수 초기값
void CAppleDlg::OnBnClickedButton2()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
KillTimer(1);
KillTimer(2);
Timer 1번 제거
Timer 2번 제거
7. 타이머
10. 메시지 항목에서 WM_LBUTTONDOWN 에 대해 처리기
추가를 하고, 코드 편집을 클릭하고 코드를 입력한다.
void CAppleDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_temp1 = 0;
CDialogEx::OnLButtonDown(nFlags, point);
}
7. 타이머
11. 메시지 항목에서 WM_TIMER 에 대해 처리기 추가를 하고,
코드 편집을 클릭한다.
7. 타이머
12. 코드 창에 아래 코드를 입력한다.
void CAppleDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
HDC hMemDC;
HICON m_iArrow, m_iApple;
CClientDC dc(this);
메모리에 디바이스 컨텍스트 생성
char a[100];
itoa 함수를 위한 변수
InvalidateRect(NULL, TRUE);
UpdateWindow();
윈도우를 지우고 갱신한다.
아이콘 표시를 위한 변수지정
m_iArrow = AfxGetApp()->LoadIcon(IDI_ICON2);
m_iApple = AfxGetApp()->LoadIcon(IDI_ICON1);
•
계속
디바이스 컨텍스트(DC : Device Context) :
그래픽과 관련한 정보를 모아 놓은 구조체
아이콘을 불러와
변수에 지정
7. 타이머
계속
300, 200
if (nIDEvent = 1) m_temp1 = m_temp1 + 10;
if (nIDEvent = 2) m_temp2 = m_temp2 + 10;
사과와 화살 위치
10씩 증가
if (m_temp2 > 300) m_temp2 = 0;
사과 위치가 300
이상이면 다시 위로
DrawIcon(dc, m_temp1, 200, m_iArrow);
DrawIcon(dc, 300, m_temp2, m_iApple);
사과와 화살 아이콘
을 가상화면에 표시
if (m_temp1 > 290 && m_temp1 < 310)
{
if (m_temp2 > 190 && m_temp2 < 210)
{
dc.TextOutA(200, 200, "명중!");
x = x + 1;
}
}
dc.TextOutA(500, 0, itoa(x, a, 10));
}
CDialogEx::OnTimer(nIDEvent);
사과 위치가 300,
화살 위치가 200
일때 명중이므로
각각 +10, -10 범위
내에 들면 명중으로
표시하고 점수를
1 올린다.
점수를 500, 0 위치에 표시한다.
7. 타이머
13. 실행 후 결과를 확인해 보고, 코드를 아래와 같이 변경해 본다.
void CAppleDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
SetTimer(1, 200, NULL);
SetTimer(2, 200, NULL);
x = 0;
화살 갯수를 초기화 한다.
y = 0;
}
void CAppleDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
y = y + 1;
화살 갯수를 10개로 제한한다.
if (y <= 10)
{
m_temp1 = 0;
}
CDialogEx::OnLButtonDown(nFlags, point);
}
도전 과제
새 프로젝트를 생성하여 아래와 같이 응용해 본다.
Apple.ico 대신 Bird.ico
Arrow.ico 대신 Rocket.ico
m_temp1 = 300 (로켓 초기값)
도전 과제
if (nIDEvent = 1) m_temp1 = m_temp1 - 10;
if (nIDEvent = 2) m_temp2 = m_temp2 + 10;
if ( m_temp2 > 600 ) m_temp2 = 0;
DrawIcon(dc, 400, m_temp1, m_iArrow );
DrawIcon(dc, m_temp2, 10, m_iApple );
if(m_temp1 > 0 && m_temp1 < 20)
{
if(m_temp2 > 380 && m_temp2 < 420)
{
dc.TextOutA(200,200,"명중!");
x = x + 1;
}
}
명중 조건
0 < m_temp1 <20
380 < m_temp2 < 420
400, 10