본문 바로가기
컴퓨터/MFC_API

글자의 크기를 알아 오기 - GetTextExtent

by adnoctum 2013. 1. 13.




   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 의 정가운데에 위치해 있는 것을 볼 수 있다. 





느무느무 간단한 것이지만 유입 검색어가 종종 있어서 작성한다. 글자의 위치를 픽셀 단위로 조절할 일이 많아서 위 작업은 의외로 자주 하게 된다. 왼쪽/오른쪽 맞춤을 해야 할 때도 자주 있고...