본문 바로가기

Win32 api

Win32 api 강의 4화.

- HPEN 을 사용.

HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); // 빨간색, 두께 5의 실선 펜 생성

HPEN hDefaultPen = (HPEN)SelectObject(hdc, hPen); // 디바이스 컨텍스트에 펜 선택

CreatePen 함수를 통해 HPEN 을 생성. 해당 오브젝트를 SelectObject 함수로 hdc 에 넣어줌.

 

PS_SOLID 는 전처리기로 0 값임. 실선을 의미한다. 

RGB 는 F12 눌러서 보면

#define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

이런식으로 이름은 RGB 지만 실상은 비트상으로 B/G/R 형태로 표현되는 듯.

빨간색(255,0,0)을 예로 들자면

0000 0000 - 0000 0000 - 0000 0000 - 1111 1111

COLORREF 는 DWORD 로 unsigned long 타입이다. 그래서 4바이트로 확인됨.

 

SelectObject(hdc, hDefaultPen);
DeleteObject(hPen); // 사용이 끝난 GDI 객체는 DeleteObject로 삭제하여 자원 해제

GDI 객체란 윈도우에서 그래픽을 그리기 위해 사용하는 리소스를 말함.

 

// HBRUSH hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // 연한 회색 브러시 가져오기
// GetStockObject: 시스템에서 미리 정의된 GDI 객체(펜, 브러시, 폰트 등)를 가져올 때 사용.
// GetStockObject 함수에서 가져온 객체는 DeleteObject로 삭제하면 안됨.
// 직접 만든 것이 아니라 시스템에서 관리하는 객체이기 때문. 
HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0)); // 초록색 브러시 생성

Brush 도 비슷한 방법으로 사용한다. GetStockObject 함수는 자주 사용하는, 미리 만들어진 

DKGRAY_BRUSH, BLACK_BRUSH 등을 반환한다.

이는 DeleteObject 해주지 않는 것이 좋음.

 

- WPARAM 과 LPARAM

WndProc 함수에 들어오는 메시지에 추가 정보로 WPARAM 과 LPARAM 을 받음.

키보드 입력은 wparam, 마우스 입력은 lparam 쪽으로 들어옴.

case WM_KEYDOWN:
    {
    switch (wParam)
    {
        // WASD 키 입력 처리
        case 'W':
            // W 키가 눌렸을 때의 처리
            MessageBox(hWnd, L"W Key Pressed", L"Key Event", MB_OK);
            break;
        // 화살표 키 입력 처리
        case VK_UP:
            // 위쪽 화살표 키가 눌렸을 때의 처리
            MessageBox(hWnd, L"Up Arrow Key Pressed", L"Key Event", MB_OK);
            break;
        default:
            break;
    }
    }
    break;
case WM_LBUTTONDOWN:
    {
        // 마우스 위치 얻기
        int xPos = LOWORD(lParam); // 마우스 X 좌표
        int yPos = HIWORD(lParam); // 마우스 Y 좌표
        MessageBox(hWnd, L"Left Mouse Button Clicked", L"Mouse Event", MB_OK);
    }
    break;

LPARAM 은 현재 64비트 운영체제에서 8바이트로 확인된다. 

그러나 마우스 위치값은 2바이트 + 2바이트로 총 4바이트만 사용해서 들어옴.

#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))

LOWORD 와 HIWORD 는 단순히 매크로로 비트 연산 2바이트 처리해주는 거임.

 

- 무효화 영역 처리

            Rectangle(hdc, 
                curPos.x-curSize.x/2, 
                curPos.y-curSize.y/2, 
                curPos.x+curSize.x/2, 
                curPos.y+curSize.y/2);

WM_PAINT 코드 블럭에 사각형을 그릴 때 키보드 입력으로 포지션 값을 업데이트하려고 하는데,

이렇게만 하면 WM_PAINT 명령이 발동하지 않아 내부적으로 사각형의 위치는 변하지만 

그래픽상으로는 변화가 없음.

InvalidateRect(hWnd, NULL, TRUE); // 윈도우 전체를 무효화하여 다시 그리기 요청

 

강제로 전체 윈도우 영역을 이전 강의에서 나온 무효화 영역 처리하여 다시 그리도록 하면

WM_PAINT 메시지가 들어와서 사각형이 움직이게 됨.

'Win32 api' 카테고리의 다른 글

Win32 api 강의 6화.  (0) 2025.09.11
Win32 api 강의 5화.  (0) 2025.09.11
Win32 api 강의 3화.  (0) 2025.09.10
Win32 api 강의 2화.  (0) 2025.09.09
Win32 api 강의 1화.  (0) 2025.09.09