windowAPI

WindowAPI 1일차 - 사각형 그리기

rimugiri 2024. 11. 17. 19:03
728x90

https://www.youtube.com/watch?v=MJ31abxA7A0&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=7

위 강의를 보면서 정리중입니다.

 

window api의 에서 알고 있어야 되는 몇가지 변수와 함수를 정리해보자

//핵심 변수
HWND // 현재 윈도우 창의 번호를 저장해 둔다
HDC // 랜더링 할수 있는 Device ID
HPEN // 펜의 색을 지정하는 Device ID
HBRUSH // 브러쉬의 색을 지정하는 DeviceID

//핵심함수
SelectObject(HDC, ??) // HDC에 ??을 설정해 줍니다 return -> 원래 ??
DeleteObject(??) // ??을 삭제해 줍니다
GetStockObject(??) // 미리 생성되어 있는 ??을 가져와 줍니다
InvalidateRect(hWnd, NULL, TRUE); // WM_PAINT 메세지를 호출합니다 TRUE는 현재 랜더링을 삭제합니다


//핵심 전처리기
LOWORD(num) // num의 하위 4바이트를 가져옵니다
HIWORD(num) // num의 상위 4바이트를 가져옵니다

 

다른 부분은 수정하지말고 WM_PAINT부분으로 돌아가 사각형을 그려보자

// 그리기용 전역 변수
POINT g_point = { 100, 100 }, g_size = { 200, 200 };

case WM_PAINT: // 무효화 영역이 발생하면 작동한다. 화면 보여졌다 안보여졌다
    {
        PAINTSTRUCT ps;

        // 윈도우 핸들
        // 윈도우 좌표 :
        //           픽셀 단위로 좌표를 나타낸다.
        //           좌측 상단이 0,0 이다.
        // hdc란? : 그리기 Device Context  
        
        // 현재 윈도우의 Device Context를 얻어온다.
        HDC hdc = BeginPaint(hWnd, &ps);

        // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
		
        // 직사각형의 펜 색을 설정한다
		HPEN hpen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
        HPEN hDefaultPen = (HPEN)SelectObject(hdc, hpen); // 기본 펜 정도 저장
				
		// 직사각형의 안의 색을 설정한다
		HBRUSH hBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
        HBRUSH hDefaultBrush = (HBRUSH)SelectObject(hdc, hBrush);
        
        Rectangle(hdc,
            g_point.x - g_size.x / 2 + g_size.x,
            g_point.y - g_size.y / 2,
            g_point.x + g_size.x / 2 + g_size.x,
            g_point.y + g_size.y / 2);

		SelectObject(hdc, hDefaultPen); // 기본 펜으로 변경
		SelectObject(hdc, hDefaultBrush);

        Rectangle(hdc,
            g_point.x - g_size.x / 2,
            g_point.y - g_size.y / 2,
            g_point.x + g_size.x / 2,
            g_point.y + g_size.y / 2);

        DeleteObject(hpen);
        DeleteObject(hBrush);

        EndPaint(hWnd, &ps);
    }
    break;

 

실제 클릭으로 사각형을 그려봅니다 -> WM_LBUTTONDOWN에서 실행할 수 있습니다

case WM_LBUTTONDOWN:
    {
        InvalidateRect(hWnd, NULL, TRUE);
	    int xPos = LOWORD(lParam); // 하위 4 바이트
	    int yPos = HIWORD(lParam); // 상위 4 바이트
	    
		g_point.x = xPos;
		g_point.y = yPos;
    }
    break;

 

이 두개를 완성했다면 클릭한 부분에 사각형 2개가 생성됩니다.

728x90