WinAPI로 그림 그리기를 해보려고 한다!

 

visual2019로 윈도우 데스크탑을 이용할 예정이다. 콜백 함수만 약간 고치면 될 거 같다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    static POINT MousePos; //마우스 x,y 좌표를 저장할 변수
    static BOOL bDrawing = FALSE;

    switch (message)
    {
    case WM_LBUTTONDOWN:
        MousePos.x = LOWORD(lParam);
        MousePos.y = HIWORD(lParam);
        bDrawing = TRUE;
        SetCapture(hWnd);
        return 0;
    case WM_MOUSEMOVE:
        if (bDrawing)
        {
            hdc = GetDC(hWnd);
            MoveToEx(hdc, MousePos.x, MousePos.y, NULL);
            MousePos.x = LOWORD(lParam);
            MousePos.y = HIWORD(lParam);
            LineTo(hdc, MousePos.x, MousePos.y);
            ReleaseDC(hWnd, hdc);
        }
        return 0;
    case WM_LBUTTONUP:
        bDrawing = FALSE;
        ReleaseCapture();
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

case 에 WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP 조건을 추가해주었다.

 

변수 선언에 static을 왜 사용해주었을까 해서 빼보고 컴파일 확인해보았다.

POINT 함수는 선언에 컴파일러가 에러가 떴고 BOOL 값 변수는 전역변수 대신해서 사용하려고 예제에서 static을 선언해 둔 거 같다.

 

타이핑 때 그림이 제대로 안 그려졌는데 x값,y값 둘 다 LOWORD를 줘서 난 에러였다.

LOWORD(lParam)에 의해 마우스 X좌표 값, HIWORD(lParam)에 의해 마우스 Y좌표 값을 반환한다!

 

 

실행화면

'WinAPI' 카테고리의 다른 글

마우스 클릭 이벤트  (0) 2021.09.29

예제로 배우는 MFC 프로그래밍을 공부해 보려고 한다.

 

visual 2019로 시작을 하였다.

원래 이렇게 코딩이 다 돼있었나?? 공부할 땐 쳐가면서 했던 기억이 있는데..

함수도 CreateWindow -> CreateWindowW로 바뀐 것들이 있는 거 같다.

 

모르는 말이 넘쳐난다.. 역시 어려운 WinAPI 이번엔 마우스 이벤트 동작만 볼 거라서 콜백 함수로 넘어간다!

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_LBUTTONDOWN:
        MessageBox(hWnd, TEXT("마우스의 왼쪽 버튼을 클릭하셨습니다."), TEXT("마우스의 왼쪽 버튼 클릭"), MB_OK);

    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_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

case 문 위치를 잘못 잡아줘서 왜 중단점이 안 타는지 찾고 있었다...

 

 

 

오호 잘 탄다!

성공!!

 

쉬운 것들이지만 차근차근해보려고 한다.

'WinAPI' 카테고리의 다른 글

마우스 그림 그리기  (0) 2021.09.29

+ Recent posts