GDI+ 공부정리
by
http://winapi.co.kr/ 에 정리된 것을 보고 공부했다.
GDI+를 공부하게 된 이유
- 간단하게 알고리즘이나 테스트 코드를 짜려고 하는데 GDI 코딩 할 게 많다.
- GDI 오브젝트 관리하기가 싫다.
- 결론적으로 GDI 가 싫어서 -_-
GDI와 GDI+의 차이점
- GDI 오브젝트 해제관리를 안 해도 된다.
- GDI+를 사용하기 위해서는 GdiplusStartupInput, GdiplusShutdown을 호출해야 한다.
- 참고로 WIN32_LEAN_AND_MEAN을 선언하면 GDI+가 컴파일이 안 된다.
- RECT 와 Rect
- GDI 는 LTRB 이지만 GDI+는 XYWH 이다.
- 그리는 픽셀단위?가 다르다.
- GDI : Rectangle(0,0,50,50); // LTRB
- GDI+ : DrawRectangle(0,0,50,50); // XYWH
- 위 코드처럼 작성해서 출력해 본다면 아래 그림처럼 GDI는 49번째 픽셀에서 테두리가 마무리되고 GDI+는 50번째 픽셀에서 마무리가 된다.
- 위와 같은 차이점으로 인해서 아래 코드처럼 작성을 하게 되면
- GDI : Rectangle(0,0,50,50); Rectangle(50,0,100,50);
- GDI+ : DrawRectangle(0,0,50,50); DrawRectangle(50,0,50,50);
- 위 그림처럼 나타나게 된다. 겹치는 부분이 있게 나열해서 그린다면 숙지해둘 부분이다.
- GDI+는 외곽선을 따로 그려야 한다.
- GDI에서는 Rectangle을 그리면 외곽선과 내부가 같이 그려지지만
- GD+는 각각 따로 호출해야 한다. Fill는 채우기 함수 Draw는 외곽선 그러기 함수이다.
- 기본 설정이 없다. (전부 말고.. 일부분에서)
- GDI는 따로 펜이나 브러시를 SelectObject 하지 않으면 기본 설정된 것으로 그리는데 (흰 바탕에 검은색 외곽)
- GDI+는 펜이나 브러시를 인자로 넣어줘야 한다.
- DrawRectangle(펜, …);
- FillRectangle(브러시, …);
* 텍스트를 뿌릴 때도 폰트를 일일이 만들어야 한다 ㅠㅠ - 이게 상당히 귀찮다.
- 알파블랜딩이 된다.
- GDI+가 GDI보다 느리다.
- GDI+로 게임 만들 것도 아닌데 뭐..
GDI+ 문제?
텍스트 크기 계산이 GDI와 다르다.
같은 텍스트의 크기(Rect)를 얻어내면 결과가 다르다.
GDI+가 약간의 공백도 포함해서 계산하는 듯 하다.
이 부분에서 대해서 문서에 명쾌하게 설명되어 있지 않다고 한다.
글 쓰면서 ‘안 된다’ 와 ‘안된다’가 헷갈렸는데 ‘안 된다’가 맞다.
tags: GDI