GDI+를 이용한 문자열 회전 출력

일반 GDI를 쓰면 폰트 생성할때 각도 설정해주고 위치 정해준다음 찍으면 된다.
GDI+를 쓰면 더 복잡하다.
그런데 폰트를 회전시키면 글자가 찌그러지는 현상이 발생하는데 내가 아는바로는 출력할때 안티얼라이싱 이외에는 방법이 없다.
문제는 GDI의 경우는 만족할만한 안티얼라이싱 효과를 주기 위해서는 윈도우 버젼이 XP이상이 되야 하는 단점이 있다.

LOGFONT의 lfQuality 값을 조정하면 된다. CLEARTYPE_QUALITY 라는 플래그 값으로 주면 되는데 이게 XP이상 버젼을 요구한다.

이 경우는 DLL을 더 배포하더라도 GDI+를 쓰는것이 좋다.
그럼 복잡한 GDI+의 코드를 보면.

Gdiplus::Graphics graphics( hdc );
Gdiplus::PointF pointF( pos.x, pos.y);
Gdiplus::SolidBrush solidBrush(Gdiplus::Color(255, 0, 0, 0));
Gdiplus::Font labelFont( hdc , &m_lfLabel);
graphics.TranslateTransform(pointF.X,pointF.Y);
graphics.RotateTransform(-(dAngle));
graphics.TranslateTransform(-pointF.X,-pointF.Y);

graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
graphics.DrawString(lpszW, -1, &labelFont, pointF, &solidBrush);

우선 lpszW 가 wchar* 로 문자열을 담고있다. 일반적으로 윈도우 프로그래밍에서 많이 사용하는 CString을 wchar로 변환하는 방법은 밑의 글을 참조하자.

1. DC핸들로 부터 Graphics 객체를 생성한뒤 문자열을 찍을 위치를 설정
2. 문자열을 찍을 위치를 PointF 구조체에 넣는다.
3. 브러시 생성
4. 여기서는 미리 가지고 있던 LOGFONT(m_lfLabel) 을 이용해서 폰트를 생성하지만 gdi+에서 폰트를 생성하는 방법은 많다. 적당히 쓰자. LOGFONT로 부터 생성하는 방법은 LOGFONT의 특정 값만들 사용한다고 한다.
5. TranslateTransform 을 이용해서 찍을 려는 위치를 Graphis 객체의 중심으로 설정한다.
6. RotateTransform 을 이용해서 Graphics 객체를 회전시킨다.
7. TranslateTransform 를 이용해서 찍을려는 위치를 회전된 위치로 옮긴다.
8. DrawString 을 이용해서 문자열을 찍는다.

….

음 무슨 3D Programming 하는것도 아니고….(3D Programming 하는 사람이 보면 웃겠지만) 문자열 찍는데 이렇게 복잡한 인터페이스로 해놓다니…

하긴 가장 기본적인 것만 제공하는게 효과적으로 사용할수 있고 응용범위가 넓어지는건 사실이다.(쓰는 사람이 알아야 될것도 많고 연구해야 할것도 많아서 그렇지)
MS는 gdi+를 이용한 간단한 3D관련 응용프로그램의 활발한 개발을 원하는게 아닐까 (예제들 보면 꽤나 그럴듯 한것도 많고)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다