- HOME
- Post in | c/c++/winapi
- Post at | 2009. 5. 26. 14:59 | by 밀크빵.
- View comment
WM_TIMER
시간과 관련된 함수들을 사용할 것이므로 프로그램 선두에 time.h를 포함시켜 두었다.
WndProc의 선두에는 시간값을 저장할 time_t형의 변수 mytime과 이 시간값을 문자열로 변경하여 저장할 str, 그리고 타이머 핸들인 hTimer 세 개의 변수가 선언되어 있다.
WM_CREATE 메시지에서 SetTimer 함수를 사용하여 타이머를 생성시켰다. 즉 윈도우가 만들어지자 마자 타이머가 만들어진다.
( WM_CREATE 메시지는 윈도우가 처음 생성될 때 발생하는데 이 메시지에서 프로그램 시작시 꼭 한번만 초기화되어야 할 처리를 해 준다. )
UNIT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc) |
hWnd 인수는 타이머 메시지를 받을 윈도우인데 통상 WndProc의 인수로 전달되는 hWnd를 그대로 써 주면 된다. 두번째 인수 nIDEvent는 타이머의 번호를 지정한다. 하나의 타이머만 사용할 경우 1을 주면 되며 여러개의 타이머를 사용할 경우 nIdEvent에 겹치지 않도록 번호를 부여하도록 한다. 예를 들어 세개의 타이머를 사용한다면 각각 1, 2, 3의 타이머 번호를 주면 되며 이 타이머 번호는 WM_TIMER 메시지에서 타이머를 구분하기 위한 표식으로 사용된다.
세번째 인수 uElapase는 1/1000초 단위로 타이머의 주기를 설정한다. 이 값이 1000이면 타이머 메시지가 1초에 한번씩 hWnd로 보내지게 될것이고 10000이면 10초에 한번씩 타이머 메시지가 발생할 것이다. 네번째 인수는 타이머 메시지가 발생할 때마다 호출될 함수를 지정하는데 사용하지 않을 경우 NULL로 설정하면 된다.
WM_TIMER 메시지는 wParam으로 타이머 ID를 전달받으며 lParam으로 타이머 메시지 발생시 호출될 함수의 번지가 전달된다. 이 예제에서는 타이머가 하나밖에 없으며 타이머 메시지 처리 함수도 지정되지 않았으므로 둘 다 무시하고 사용하지 않는다. WM_TIMER 메시지가 발생하면 time 함수로 시간을 조사한 후 ctime 함수로 문자열로 바꾼후 문자열 str에 저장해 둔다. 두 함수의 원형은 다음과 같다.
time_t time( time_t *timer ); char *ctime( const time_t *timer );time 함수는 현재 시간을 조사해 주는데 이 때 조사되는 값은 1970년 1월 1일 자정 이후 경과한 초이며 조사된 값은 인수로 전달된 time_t형의 변수에 대입되며 동시에 리턴값으로도 전달된다. 만약 오늘이 1998년 1월 1일 0시라면 조사되는 값은 31536000*28이 될 것이다. 이렇게 조사된 시간값은 ctime 함수에 의해 문자열로 변경된다. ctime은 time_t값으로부터 현재 날짜와 시간을 계산하여 정확하게 문자열로 변경해 주며 그 문자열을 리턴해 준다.
예제에서는 mytime이라는 time_t형의 변수에 시간값을 조사한 후 이 값을 문자열로 변경하여 str 문자열 포인터에 대입하였다. 이제 남은 일은 조사된 시간을 화면으로 출력하는 것이다. WM_TIMER에서는 시간이 갱신될 때마다 화면을 갱신시키기 위해 InvalidateRect 함수를 호출하고 있다.
마지막으로 해 주어야 할 일은 WM_DESTROY 메시지에서 설치된 타이머를 제거해 주는 것이며 이 때는 KillTimer 함수를 사용한다.
BOOL KillTimer( HWND hWnd, UINT uIDEvent ); |
KillTimer의 첫번째 인수로 이 타이머를 소유한 윈도우 핸들을 넘겨주며 두번째 인수로 타이머 ID를 넘겨준다. 주의할 것은 타이머 ID는 SetTimer의 두번째 인수로 지정한 값을 말하는 것이지 SetTimer가 리턴한 값을 말하는 것이 아니라는 점이다. 이 예제에서는 SetTimer에서 타이머 ID를 1이라는 상수로 주었으므로 파괴할 때도 타이머 ID로 상수 1을 넘겨 주어야 한다. SetTimer의 리턴값은 타이머를 소유하는 윈도우 없이 타이머가 만들어졌을 경우, 즉 SetTimer의 첫번째 인수가 NULL일 경우에 한해 특별하게 사용하는 것이되 거의 사용되지 않는다고 보면 된다.
'c/c++ > winapi' 카테고리의 다른 글
[API]OWNERDRAW로 버튼 이미지 바꾸기 (0) | 2012.08.01 |
---|---|
[API] 슬라이더에서 값 읽어오기 (0) | 2012.07.23 |
[API] 버튼에 이미지 씌우기 (0) | 2012.07.23 |
Win32 API에 버튼 추가하기 (0) | 2009.11.07 |
ComboBox (0) | 2009.05.26 |