본문 바로가기
프로그래밍/API

API-타이머

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 21.


프로그램이 실행되면서 시간에 대해 설정하는 예제,

#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("MyTimer");

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpszCmdParam, int nCmdShow )
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass( &WndClass );

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;
	PAINTSTRUCT ps;
	SYSTEMTIME st;
	static TCHAR sTime[128];	// Time을 저장할 문자열
	static RECT rt = { 100, 100, 400, 120 };	// 지우는 범위를 지정해 보았다

	switch( iMessage )
	{
	case WM_CREATE:		// 윈도우가 생성되면 최초, 한번 거치게 된다.
		SetTimer( hWnd, 1, 1000, NULL );	// 타이머를 만드는 함수, 실행시 타이머가 만들어 진다.
		// 첫번째 인자는 윈도우 핸들, 두번째는 타이머의 ID를 지정한다.
		// 여러개의 타이머를 생성한다고 하면,
		// SetTimer( hWnd, 1, 1000, NULL );SetTimer( hWnd, 2, 1000, NULL );
		// 이런식으로 해 주어야 한다.
		// 세번째는 타이머의 주기, 1/1000초(1000으로 해야 1초에 한번씩)
		// 네번째 인자는 타이머 함수가 발생 할때 호출될 함수를 지정한다고 함.
		// 즉 위 설정은 1초에 한번씩 WM_TIMER:을 호출 할 것이다.
		// 시작시 바로 등장을 하게 하기 위해
		SendMessage( hWnd, WM_TIMER, 1, 0 );
		// WM_TIMER을 호출한다, wParam, lParam을 각각 2,3번째 인자로 호출
		// 타이머의 wParam이 타이머의 ID,
		// lParam이 타이머 발생시 호출된 함수의 번지이기 때문에
		// 1, 0으로 각각 넣어 주었다.
		return 0;
	case WM_TIMER:	// wParam으로 타이머 ID를 전달 받게 되고,
		// lParam으로 타이머 메시지 발생시 호출될 함수의 번지가 전달된다.
		GetLocalTime(&st);	// 현재 시간을 st에 저장하게 된다.
		// wsprintf를 사용하여 sTime에 text로 시간을 저장,
		wsprintf( sTime, TEXT("지금 시간은 %d:%d:%d입니다."), 
			st.wHour, st.wMinute, st.wSecond );
		// 무효화를 시키면서 PAINT를 호출하게 된다.
		InvalidateRect( hWnd, &rt, TRUE );	// rt의 범위만큼만 계산
		return 0;
	case WM_DESTROY:
		// 타이머는 전역적으로 선언이 되기 때문에,
		// 사용하지 않으면 소멸을 시켜야 한다.
		// KillTimer는 그런 존재.
		// 두번째 인자는 Timer의 번호, 
		// 현재는 1개 밖에 없기 때문에 1을 넘기고 있다.
		// 정확히는 Timer의 ID를 넘기게 된다.
		KillTimer( hWnd, 1 );
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		// 꾸준히 화면에 시간을 출력한다.
		hdc = BeginPaint( hWnd, &ps );
		TextOut( hdc, 100, 100, sTime, lstrlen(sTime));
		EndPaint( hWnd, &ps );
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​


// 실행 화면

시계를 표시.

'프로그래밍 > API' 카테고리의 다른 글

API-무한의 작업을 위한 타이머(1)  (0) 2010.04.21
API-2개의 타이머  (0) 2010.04.21
API-마우스입력  (0) 2010.04.21
API-Key입력(2)  (0) 2010.04.21
API-Key입력(1)  (0) 2010.04.21