- 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 |