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

API-Key입력(1)

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



API에서 사용자가 Key를 입력 했을 때 연산을 하는 방법,

#include <windows.h>

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

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;
	static TCHAR str[256];	// 한번 입력 하면 꾸준히 값을 가지고 있어야 하기 때문에 Static
	int len;	// 문자열의 길이를 담당할 int형 변수

	switch( iMessage )
	{
	// 문자 입력에 관한 메시지가 넘어 오면
	//case WM_CHAR:
	//	len = lstrlen( str );	// str에 존재하는 현재 문자열 숫자를 len에 보관하고
	//	str[len] = ( TCHAR ) wParam;	// 문자열의 마지막 위치(종료위치)에 wParam에서 가져온 문자를 삽입
	//	str[len+1] = 0;	// 그 다음 배열을 마지막(종료위치)으로 잡는다.
	//	// 입력이 종료되면 바로 PAINT를 부르기 위해 존재하는 
	//	// InvalidateRect함수
	//	InvalidateRect( hWnd, NULL, FALSE );
	//	// WM_PAINT:에서는 무효화가 이루어지면, 다시 그리기를 하게 되는데,
	//	// InvalidateRect를 사용 하면 모든 부분에 대해 강제 무효화를 시키게 되고
	//	// PAINT에서는 입력을 받을때 마다 다시 그려주게 되는것이다.
	//	// 그래서 InvalidateRect함수가 없으면 무효화가 이루어지기 전까진
	//	// 실시간으로 그려지지 않게 된다.
	//	// InvalidateRect는 첫번째 인자에 무효화를 시킬 대상 윈도우의 핸들과,
	//	// 사각영역, bool 타입을 받고 있는데,
	//	// bool 타입이 true라면 무효화 되기전 배경을 모두 지운 후 그릴 것인가.
	//	// false라면 그렇지 않고 그 위에 덮어 그린다, 라고 볼 수 있다.
	//	return 0;
	case WM_CHAR:
		if( (TCHAR) wParam == ' ' )	// 스페이스 바 키를 누르면 문자열을 삭제(실제로는 바로 종료값을 넣어 버린것)
		{
			str[0] = 0;
		}
		else 
		{
			len = lstrlen(str);
			str[len] = (TCHAR)wParam;
			str[len+1] = 0;
		}
		InvalidateRect( hWnd, NULL, TRUE );	// false라면 무효화가 이루어 지기 전엔
		// 스페이스바를 눌러도 글자로 바로 지워지지 않을 것이다.
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint( hWnd, &ps );
		TextOut( hdc, 100, 100, str, lstrlen(str));
		EndPaint( hWnd, &ps );
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​


// 출력 결과

설명 : 스페이스바를 누르면 글자가 지워진다.

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

API-마우스입력  (0) 2010.04.21
API-Key입력(2)  (0) 2010.04.21
API-MessageBox  (0) 2010.04.19
API-GraphOut  (0) 2010.04.19
API-DrawText  (0) 2010.04.19