SetTimer

원형 WORD SetTimer(HWND hWnd, int nIDEvent,WORD wElapse,FARPROC lpTimerFunc);
인수 ▶hWnd:타이머가 보내는 WM_TIMER 메시지를 받을 윈도우의 핸들. NULL일 경우 WM_TIMER 메시지는 보내지지 않으며 이 경우 콜백 함수를 등록해야 한다.

▶nIDEvent:타이머의 번호, 윈도우즈에는 한꺼번에 여러개의 타이머가 설치될 수 있으므로 타이머끼리의 구분을 위해 타이머 번호가 필요하다. 여기서 지정한 타이머 번호는 타이머가 WM_TIMER 메시지를 보낼때 wParam으로 전달된다. 이 ID는 또한 KillTimer에 의해 타이머를 해제할 때도 사용된다.

▶wElapse:WM_TIMER 메시지가 생성될 시간 간격을 1/1000초 단위로 지정한다. 최소 간격은 98의 경우55/1000초이며 NT/2000의 경우 1/100초이다.

▶lpTimerFunc:보통 이 값은 NULL로 지정하여 WM_TIMER메시지가 WndProc으로 전달되도록 한다. 이 인수에 별도의 값을 지정할 경우 WM_TIMER메시지는 이 인수가 지정하는 분리된 콜백 함수로 전달된다. 콜백 함수는 타이머 메시지보다 좀 더 정확한 시간에 호출된다.

리턴

hWnd가 NULL일 경우 타이머 ID를 리턴하며 이 ID는 KillTimer에 의해 타이머 해제시에 사용된다. hWnd가 NULL이 아니고 타이머 생성에 성공한 경우 nonzero가 리턴되며 타이머 생성에 실패하면 0을 리턴한다. SetTimer 함수의 리턴값은 일반적으로 사용하지 않는다.

설명

타이머를 생성하고 wElapse가 지정하는 간격으로 WM_TIMER메시지를 보낸다. WM_TIMER 메시지를 받는 곳은 lpTimerFunc의 설정에 따라 달라진다. lpTimerFunc가 NULL일 경우는 타이머를 설치한 윈도우의 WndProc으로 보내지며 그렇지 않을 경우는 lpTimerFunc가 지정하는 콜백함수로 보내진다. 타이머 메시지는 응용 프로그램의 메시지 큐에 저장되며 윈도우즈의 다른 프로그램에 의해 시간이 지연될 수도 있으므로 반드시 정확한 간격으로 전달된다는 보장은 없다. 시계, 간단한 에니메이션 등 일정한 주기로 호출되어져야 할 함수가 있을 때 보통 타이머 메시지를 사용한다. 또는 시스템의 속도와는 무관하게 일정한 속도를 유지해야하는 게임등에도 타이머 메시지가 사용된다.

만약 hWnd의 nIDEvent 타이머가 이미 설치되어 있다면 이 함수는 새로운 주기로 타이머를 다시 설치하며 이 경우 타이머는 리셋된다. 타이머의 주기를 바꾸고자 할 경우 같은 ID로 이 함수를 호출해 준다.

예제 1

다음 예제는 두 개의 타이머를 설치한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rt;
	char Mes[]="타이머 예제입니다.";

	switch(iMessage) {
	case WM_CREATE:
		SetTimer(hWnd,1,500,NULL);
		SetTimer(hWnd,2,3000,NULL);
		return 0;
	case WM_TIMER:
		switch(wParam)
		{
		case 1:
			GetWindowRect(hWnd,&rt);
			rt.left+=5;
			rt.right+=5;
			MoveWindow(hWnd,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,TRUE);
			break;
		case 2:
			MessageBeep(0);
			break;
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		KillTimer(hWnd,1);
		KillTimer(hWnd,2);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

ID 1번의 타이머는 0.5초 간격으로 호출되며 매번 윈도우를 오른쪽으로 5픽셀씩 옮긴다. ID 2번의 타이머는 3초 간격으로 호출되며 비프음을 출력한다. WM_TIMER에서는 wParam를 읽어 타이머를 구분하며 WM_DESTROY에서는 KillTimer 함수로 타이머를 해제한다.

참고함수 KillTimer : 타이머를 해제한다.
플렛폼 95이상
본문참조

written by http://www.winapi.co.kr