Programming Language/Windows API

입력된 방향키 확인

D4tai1 2018. 9. 30.

1. 상하좌우와 가운데 사각형을 그리고 입력된 방향의 색상을 변경

[1] 방향키를 누르면 해당 방향의 색상은 빨간색으로 변경되어야 한다.

[2] 키를 떼면 원래대로 돌아와야 한다.

[3] 누르고 있는 동안은 해당방향의 사각형은 빨간색으로 유지해야 한다.

 

2. 소스

1) 사용자 정의함수

void my_init(HDC hdc, int x, int y, int *flag, HBRUSH *hBrush) {
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			int value = (3 * i) + j + 1;
			//value = 현재 for문의 횟수
			if (value % 2 == 0 || value == 5) {
				//2로 나누어 떨어지거나 5이면?
				//즉 대각선을 없애고 상하좌우와 가운데만 사각형과 텍스트를 그린다.
				TCHAR tmp[20];

				switch (value) {
				case 2:
					_stprintf_s(tmp, _T("상"));
					break;
				case 4:
					_stprintf_s(tmp, _T("좌"));
					break;
				case 6:
					_stprintf_s(tmp, _T("우"));
					break;
				case 8:
					_stprintf_s(tmp, _T("하"));
					break;
				default:
					_stprintf_s(tmp, _T(""));
					//가운데이면 표시 x
				}

				if (*flag == value) {
					//입력된 키와 사각형의 위치가 같으면
					*hBrush = CreateSolidBrush(RGB(255, 0, 0));
					//브러시핸들에 빨간색을 저장
					SelectObject(hdc, *hBrush);
					//창의 브러시속성에 빨간색을 부여
				}

				Rectangle(hdc, x + j * 100, y + i * 100, x + (j + 1) * 100, y + (i + 1) * 100);
				SelectObject(hdc, GetStockObject(WHITE_BRUSH));
				//DeleteObject(hBrush);
				//흰색으로 변경하거나 브러시속성을 지운다.

				TextOut(hdc, x + j * 100 + 42, y + i * 100 + 42, tmp, _tcslen(tmp));
				//특정 위치에 특정 글자를 출력한다.
			}
		}
	}
}

 

2) 윈도우 메세지처리함수

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int x;
	static int y;
	//사각형의 좌표

	static int flag;
	//입력된 상하좌우의 번호

	static HBRUSH hBrush;
	//그릴 사각형의 색상을 저장

	switch (message)
	{
	case WM_CREATE:
	{
		x = 200;
		y = 200;
		//초기 사각형의 좌표

		flag = 0;
		//입력된 방향 없음
	}
	break;

	case WM_COMMAND:
	{
		int wmId = LOWORD(wParam);
		// 메뉴 선택을 구문 분석합니다.
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
	}
	break;

	case WM_KEYDOWN:
	{
		if (wParam == VK_UP) {
			flag = 2;
		}
		else if (wParam == VK_DOWN) {
			flag = 8;
		}
		else if (wParam == VK_LEFT) {
			flag = 4;
		}
		else if (wParam == VK_RIGHT) {
			flag = 6;
		}
		InvalidateRgn(hWnd, NULL, TRUE);
	}
	break;

	case WM_KEYUP:
	{
		flag = 0;
		InvalidateRgn(hWnd, NULL, TRUE);
	}
	break;

	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hWnd, &ps);

		my_init(hdc, x, y, &flag, &hBrush);

		EndPaint(hWnd, &ps);
	}
	break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

 

 

3. 시연

- 처음 설정 시 색상을 GetStockObject(GRAY_BRUSH) 로 부여하여 회색으로 출력되었다.

'Programming Language > Windows API' 카테고리의 다른 글

지렁이게임  (0) 2018.09.30
두더지잡기 게임  (0) 2018.09.30
사각형 그리기  (0) 2018.09.30
도형 자동이동  (0) 2018.09.30
마우스로 도형 옮기기  (0) 2018.09.30

댓글