Win32 API with 나우캠퍼스

Win32 API 6강. (3) 타이머

코다람쥐 2022. 8. 16. 16:45

1. 타이머

▩ 역할

일정한 시간 간격으로 함수 호출 또는 WM_TIMER 메시지 발생

 

▩ 사용 용도

일정한 시간 간격으로 코드 실행

 

▩ 생성

UINT_PTR SetTimer(
  [in, optional] HWND      hWnd,
  [in]           UINT_PTR  nIDEvent,
  [in]           UINT      uElapse,
  [in, optional] TIMERPROC lpTimerFunc
);

hWnd : 윈도우 핸들

nIDEvent : 타이머의 아이디(양의 정수값)

uELAPSE : 일정시간 간격(단위는 ms)

lpTimerFunc : 함수 전달.(함수포인터임), WM_TIMER를 사용하기 위해선 NULL을 입력

 

 

▩ 해제

BOOL KillTimer(
  [in, optional] HWND     hWnd,
  [in]           UINT_PTR uIDEvent
);

▩ UINT_PTR

unsigned int, unsigned _int64

 

타이머 이벤트 처리


▩ 메시지 처리

WM_TIMER + wParam(아이디)

 

사용예시.

    static char string[100];
    static int timer1 = 0, timer2 = 0;

    switch (message)
    {
    case WM_CREATE:
        SetTimer(hWnd, 1, 1000, NULL); // 타이머1 생성
        SetTimer(hWnd, 2, 5000, NULL); // 타이머2 생성
        break;
    case WM_TIMER:
        switch (wParam)
        {
        case 1:
            timer1++;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        case 2:
            timer2 += 5;
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        }
        break;
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            sprintf_s(string, "타이머1 : %d, 타이머2 : %d", timer1, timer2);
            TextOut(hdc, 0, 0, string, strlen(string));
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        KillTimer(hWnd, 1); // 타이머1 해제
        KillTimer(hWnd, 2); // 타이머2 해제
        PostQuitMessage(0);
        break;
    }

 

▩ 콜백 함수 처리

void CALLBACK TimerProc(
HWND hwnd, 
UINT uMsg, 
UINT idEvent, 
DWORD dwTime );

hwnd : 윈도우 핸들

uMsg : 타이머 메시지

idEvent : 타이머 아이디

dwTime : 일정시간 간격(단위는 ms)