ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WinAPI] GDI+로 이미지 회전시키기
    프로그래밍 공부/Win API 2022. 12. 6. 18:11
    728x90

    12.05부터 던그리드 모작 일주일 포트폴리오를 시작했다.

    현재까지 만들어진 프레임워크를 기반으로 만들었기 때문에 이미지는 GDI 기반으로 처리된다.

    그러나 던그리드의 경우, 플레이어의 무기가 마우스 좌표 위치에 따라 각도가 바뀐다.

    즉, 회전이 들어간다.

    시간 절약을 위해 만들어진 GDI 프레임워크를 기반으로 하되, 플레이어의 모션 부분에만 GDI+를 추가했다.

     

    서치력과 이해력의 부족, 오래된 정보로 인한 미동작으로 상당히 고생했기 때문에 업로드를 해 본다.

     

     

    GDI+로 회전을 시키는 방법은 다음과 같다.

    우선 헤더 파일에 라이브러리를 추가해준다.

    pch에서 #define WIN32_LEAN_AND_MEAN 를 통해 거의 사용되지 않는 내용을 Windows 헤더에서 제외했기 때문에 ole2.h도 추가해주어야 한다.

    #include <ole2.h>
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment(lib, "Gdiplus.lib")

     

    전역변수로 다음과 같이 선언한다.

    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;

     

    GDI+를 사용하기 위해선 클래스 생성자를 써 주어야 한다.

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    또한 소멸자에 GDI+를 닫는다는 내용을 써 주어야 한다.

    GdiplusShutdown(gdiplusToken);

     

    //1. 회전 시킬 사진을 비트맵으로 불러들인다. JPG,PNG 사용이 가능하다.
    	Bitmap* _bmp = (Bitmap*)Image::FromFile(L"Resources/weapon.png");
    
    //2. 이미지를 회전시켜도 잘리지 않을 정도의 크기로 빈 비트맵을 생성한다.
        Bitmap _tempBmp(_bmp->GetWidth(), _bmp->GetHeight());
    
    //3. 그려줄 것이므로 전체 화면 DC를 받아온다.
    //   ㄴ (더블버퍼를 위해 미리 만들어 둔 함수 사용)
    	Graphics _gx(getMemDC());
    
    //4. 2번에서 생성한 비트맵의 사이즈에 맞는 DC를 받아온다.
    	Graphics _tempgx(&_tempBmp);
    
    //5. 좌표계를 돌린다.
    //   ㄴ_angle만큼 돌려버린다.
    //     ㄴ radian이 아닌 degree 값.
    //   ㄴ PointF는 회전의 중심축이다.
    	Matrix _matrix;
    	_matrix.RotateAt(_angle, PointF((float)(_tempBmp.GetWidth() / 2), (float)(_tempBmp.GetHeight() / 2)));
    
    //6. 5번의 좌표계를 2번에 세팅해서 DC를 회전시킨다.
    	_tempgx.SetTransform(&_matrix);
        
    //7. 이미 돌아간 좌표계에 그림을 그리면 회전되어 그려진다.
    	_tempgx.DrawImage(_bmp, 0, 0);
        
    //8. 회전되어 그려진 그림을 원하는 좌표에 그린다.
        _gx.DrawImage(&_tempBmp, _rc.left - 80, _rc.top - 20);
    	
    //9. 메모리 누수를 막기 위해 설정을 삭제해준다. 
        delete ...

     

    이를 통해 다음과 같이 마우스 위치에 따라 무기의 각도가 변하도록 만들었다.

    728x90
Designed by Tistory.