Win32 - API - Input

[TOC]

입력

키보드

WM_CHAR

case WM_CHAR:
{
    g_str[g_strIndex++] = wParam;
    InvalidateRect(NULL, NULL, TRUE);
}

WM_KEYDOWN

case WM_KEYDOWN:
{
	switch (wParam)
	{
	case VK_LEFT:
		g_movableTextPosition.x -= 1;
		break;
	case VK_RIGHT:
		g_movableTextPosition.x += 1;
		break;
	case VK_UP:
		g_movableTextPosition.y -= 1;
		break;
	case VK_DOWN:
		g_movableTextPosition.y += 1;
		break;
	default:
		break;
	}

	InvalidateRect(hWnd, NULL, TRUE);
}

WM_KEYUP

GetAsyncKeyState()

GetAsyncKeyState() 리턴값

? 아래 테이블 검증

설명
0x0000 이전에 누른 적이 없고 호출 시점에도 눌려있지 않은 상태
0x0001 이전에 누른 적이 있고 호출 시점에는 눌려있지 않은 상태
0x8000 이전에 누른 적이 없고 호출 시점에는 눌려있는 상태
0x8001 이전에 누른 적이 있고 호출 시점에도 눌려있는 상태
if (GetAsyncKeyState(VK_F1) & 0x8000) {
	g_bF1KeyDown = TRUE;
}
else {
	g_bF1KeyDown = FALSE;
}

마우스

WM_MOUSEMOVE

// 드래그하여 사각형 그리기 방법 1.
if (g_bDragging) { // WM_LBUTTONDOWN에서 TRUE로 만든다.
	WORD x = LOWORD(lParam);
	WORD y = HIWORD(lParam);
	HDC hdc = GetDC(hWnd);
	Rectangle(hdc, g_dragStartPosition.x, g_dragStartPosition.y, x, y);
	ReleaseDC(hWnd, hdc);
}

// 드래그하여 사각형 그리기 방법 2.
if (wParam == MK_LBUTTON) {
	WORD x = LOWORD(lParam);
	WORD y = HIWORD(lParam);
	HDC hdc = GetDC(hWnd);
	Rectangle(hdc, g_dragStartPosition.x, g_dragStartPosition.y, x, y);
	ReleaseDC(hWnd, hdc);
}

타이머

	case WM_CREATE: // 윈도우가 처음 생성됐을 때 발생
		SetTimer(hWnd, 1, 1000, NULL);
		SetTimer(hWnd, 2, 2000, NULL);
		break;

	case WM_TIMER:
	{
		switch (wParam)
		{
		case 1:
			g_nTimerCount1++;
			break;

		case 2:
			g_nTimerCount2++;
			break;

		default:
			break;
		}
		InvalidateRect(hWnd, NULL, false);
	}
	break;

	case WM_DESTROY:
		KillTimer(1);
		KillTimer(2);
		PostQuitMessage(0); // GetMessage() 함수가 0을 반환하게 된다.
	break;

타이머 콜백함수

SetTimer(hWnd, 2, 2000, TimerProc);

VOID CALLBACK TimerProc(HWND hWnd, UINT message, UINT_PTR id, DWORD time) {
	g_nTimerCount2++;
}