bdfgdfg

키보드와 마우스 본문

게임프로그래밍/Win32 API

키보드와 마우스

marmelo12 2021. 9. 26. 17:52
반응형

키보드

문자 키에 발생하는 메시지

- WM_CHAR  -> 어떤 문자가 입력되었는지는 모름.

대소문자 구분 방법

wParam : 아스키 코드 값

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static wchar_t string[100];
    static int index;
    switch (message)
    {
    case WM_CHAR:
        string[index] = (wchar_t)wParam;
        ++index;
        InvalidateRect(hWnd, NULL, true);
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            TextOut(hdc, 10, 10, string, lstrlen(string));
            EndPaint(hWnd, &ps);
        }
        break;
    return 0;
}

이것외에도 모든 키에 대해 발생하는 메시지 WM_KEYDOWN(키가 한번 눌렸을 때)메시지가 있고.

모든 키에 해당하는 가상 키 코드가 존재한다(매크로).

혹은 GetKeyAsyncKeyState('D') & 0x8000과 같이 키입력 유무를 체크할 수 있다.

    case WM_KEYDOWN:
        switch (wParam) // wParam은 가상 키코드(매크로)에도 대응
        {
        case VK_SPACE:
            g_hdc = GetDC(g_hwnd);
            TextOut(g_hdc, 10, 10, L"스페이스키", 5);
            ReleaseDC(g_hwnd, g_hdc);
            break;
        }
        if (GetAsyncKeyState('D') & 0x8000)
        {
            g_hdc = GetDC(g_hwnd);
            TextOut(g_hdc, 100, 10, L"D키", 2);
            ReleaseDC(g_hwnd, g_hdc);
        }
        break;

 

마우스

WM_MOUSEMOVE 메시지

- 마우스 이동시 발생

 

마우스 위치 정보

- LOWORD(lParam) -> x좌표

- HIWORD(lParam) -> y좌표

-> 즉 하나의 자료형에서 16비트(2바이트 WORD)씩 나누어 x,y좌표를 저장한다

(대부분 키보드는 wParam, 마우스는 lParam을 통해 들어옴.)

 

static int xpos, ypos;
std::wstring str;
switch (message)
{
case WM_MOUSEMOVE:
    xpos = LOWORD(lParam);
    ypos = HIWORD(lParam);
    // 여기까지 좌표값을 얻어옴
    InvalidateRect(hWnd, NULL, TRUE);// 무효화 영역 -> 계속갱신
    break;
case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
        //TextOut(hdc, 10, 10, string, lstrlen(string));
        str += L"X 좌표 : ";
        str += std::to_wstring(xpos);
        str += L"  ";
        str += L"Y 좌표 : ";
        str += std::to_wstring(ypos);
        TextOut(hdc, 30, 30, str.c_str(), str.size());

        EndPaint(hWnd, &ps);
    }

참고로 InvalidateRect를 꼭 해줘야한다. -> WM_PAINT 메시지 발생

 

그 외 마우스 메시지 WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_LBUTTONUP 등등

 

마우스는 wParam으로도 눌림등의 여부를 확인할 수 있다.

wParam으로 전달되는 코드가 있다

MK_LBUTTON, MK_MBUTTON, MK_RBUTTON등등

 

드래그 ★

WM_MOUSEMOVE + MK_LBUTTON

드래그란 마우스 왼쪽버튼을 누른상태로 마우스의 이동이다.

 static std::wstring str;
 switch (message)
 {
 case WM_MOUSEMOVE:
     if (wParam == MK_LBUTTON)
         str += L"마우스 드래그중";
     else
         str += L"마우스 이동중";
     InvalidateRect(hWnd, NULL, TRUE);
     break;
 case WM_PAINT:
     {
         PAINTSTRUCT ps;
         HDC hdc = BeginPaint(hWnd, &ps);
         TextOut(hdc, 10, 10,str.c_str(), str.size());
         str.clear(); // 필수
         EndPaint(hWnd, &ps);
     }
     break;

 

 

 

반응형

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

WinAPI 그래픽  (0) 2021.09.25
Winapi 구조 - 2  (0) 2021.09.25
PeekMessage와 GetMessage, 키입력  (0) 2021.09.22
Win32 API 구조 - 1  (0) 2021.09.13
Win32 API 프로그래밍  (0) 2021.09.12
Comments