programming notes

View on GitHub

http://winapi.co.kr/ 에 정리된 것을 보고 공부했다.

GDI+를 공부하게 된 이유

  1. 간단하게 알고리즘이나 테스트 코드를 짜려고 하는데 GDI 코딩 할 게 많다.
  2. GDI 오브젝트 관리하기가 싫다.
  3. 결론적으로 GDI 가 싫어서 -_-

GDI와 GDI+의 차이점

  1. GDI 오브젝트 해제관리를 안 해도 된다.
  2. GDI+를 사용하기 위해서는 GdiplusStartupInput, GdiplusShutdown을 호출해야 한다.
    • 참고로 WIN32_LEAN_AND_MEAN을 선언하면 GDI+가 컴파일이 안 된다.
  3. RECT 와 Rect
    • GDI 는 LTRB 이지만 GDI+는 XYWH 이다.
  4. 그리는 픽셀단위?가 다르다.
    • 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);
    • 위 그림처럼 나타나게 된다. 겹치는 부분이 있게 나열해서 그린다면 숙지해둘 부분이다.
  5. GDI+는 외곽선을 따로 그려야 한다.
    • GDI에서는 Rectangle을 그리면 외곽선과 내부가 같이 그려지지만
    • GD+는 각각 따로 호출해야 한다. Fill는 채우기 함수 Draw는 외곽선 그러기 함수이다.
  6. 기본 설정이 없다. (전부 말고.. 일부분에서)
    • GDI는 따로 펜이나 브러시를 SelectObject 하지 않으면 기본 설정된 것으로 그리는데 (흰 바탕에 검은색 외곽)
    • GDI+는 펜이나 브러시를 인자로 넣어줘야 한다.
    • DrawRectangle(펜, …);
    • FillRectangle(브러시, …);
      * 텍스트를 뿌릴 때도 폰트를 일일이 만들어야 한다 ㅠㅠ
    • 이게 상당히 귀찮다.
  7. 알파블랜딩이 된다.
  8. GDI+가 GDI보다 느리다.
    • GDI+로 게임 만들 것도 아닌데 뭐..

GDI+ 문제?

텍스트 크기 계산이 GDI와 다르다.

같은 텍스트의 크기(Rect)를 얻어내면 결과가 다르다.

GDI+가 약간의 공백도 포함해서 계산하는 듯 하다.

이 부분에서 대해서 문서에 명쾌하게 설명되어 있지 않다고 한다.


글 쓰면서 ‘안 된다’ 와 ‘안된다’가 헷갈렸는데 ‘안 된다’가 맞다.