컴퓨터/MFC_API
글자의 크기를 알아 오기 - GetTextExtent
adnoctum
2013. 1. 13. 16:30
CDC 의 instance 나 CDC 를 상속받은 클래스에서 글자를 출력할 때 글자의 크기를 픽셀 단위로 반환해 주는 함수는 GetTextExtent 이다. 사용법은 매우 간단하다.
CSize CDC::GetTextExtent(LPCTSTR lpszString, int nCount) const;
CSize CDC::GetTextExtent(const CString& str) const;
중 하나를 사용하면 된다. 그러면 [str]을 출력하기 위해 필요한 글자의 크기를 pixel 단위로 반환받을 수 있다. 간단한 사용 예를 살펴 보면 다음과 같다.
int x = margin_left + static_cast<int>(0.5 + i*(bar_width/(tick_num - 1.0))); int y = line_y; pDC->MoveTo(x,y); pDC->LineTo(x,y+space_between_line_text); CString str; str.Format(_T("%.1f"),value); CSize font_size = pDC->GetTextExtent(str); int font_x = margin_left + static_cast<int>(0.5 + i*(bar_width/(tick_num - 1.0)) - 0.5*font_size.cx); int font_y = line_y + space_between_line_text; pDC->TextOut(font_x, font_y, str);
위는 주로 텍스트의 가운데 맞춤을 할 때 필요한데, 지정한 좌표가 정확히 글자의 가운데가 되게 하기 위해서는 글자의 크기를 알아야 하기 때문이다. 공식이랄 것도 없이, 주어진 좌표 (x,y)에 CSize sz pixel 인 글자의 x 축의 값이 [x] 가 되게 하기 위해서는
int font_x = static_cast<int>(0.5 + x - 0.5*sz.cx);
로 하면 되겠지. 이런 식으로 글자를 정가운데 맞춤을 해서 출력한 결과의 예는 다음과 같다.
아래의 숫자들이 tick 의 정가운데에 위치해 있는 것을 볼 수 있다.
느무느무 간단한 것이지만 유입 검색어가 종종 있어서 작성한다. 글자의 위치를 픽셀 단위로 조절할 일이 많아서 위 작업은 의외로 자주 하게 된다. 왼쪽/오른쪽 맞춤을 해야 할 때도 자주 있고...