2009-07-14 5 views
16

GetTextMetrics 함수를 사용하고 tmAveCharWidth * strSize를 사용하는 것보다 WIN32에서 더 정확하게 문자열의 너비를 측정 할 수 있습니까?WIN32에서 문자열의 너비를 찾는 방법

+2

"tmAveCharWidth * strSize"는 고정 너비 글꼴에만 적용됩니다. –

답변

20

것은 GetTextExtentPoint32를 사용해보십시오. 주어진 장치 컨텍스트의 현재 글꼴을 사용하여 렌더링 된 문자열의 너비와 높이를 논리 단위로 측정합니다. 기본 매핑 모드 인 MM_TEXT의 경우 1 논리 단위는 1 픽셀입니다.

그러나 현재 장치 컨텍스트에 대한 매핑 모드를 변경 한 경우 논리 단위가 픽셀과 다를 수 있습니다. 다른 mapping modes on MSDN에 대해 읽을 수 있습니다. 매핑 모드를 사용하면 GetTextExtentPoint32에 의해 반환 된 치수를 픽셀로 변환 할 수 있습니다.

+0

고마워, 이것이 내가 lokking하고 있었던 것이다. :) – Razvi

+1

GetTextExtentPoint32는 "논리 단위"를 사용합니다. 픽셀이 아닙니다. http://msdn.microsoft.com/en-us/library/dd144938%28VS.85%29.aspx – user20493

+1

@user 잘 잡습니다. 매핑 모드가 MM_TEXT (기본값) 일 때 1 논리 단위 = 1 픽셀이지만 반드시 그런 것은 아닙니다. 내 대답을 수정하겠습니다. –

3

Graphics::MeasureString?

VOID Example_MeasureString(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    // Set up the string. 
    WCHAR string[] = L"Measure Text"; 
    Font font(L"Arial", 16); 
    RectF layoutRect(0, 0, 100, 50); 
    RectF boundRect; 
    // Measure the string. 
    graphics.MeasureString(string, 12, &font, layoutRect, &boundRect); 
    // Draw a rectangle that represents the size of the string. 
    graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect); 
}
+0

귀하의 방법은 확실히 GetTextExtentPoint32()를 사용하는 것보다 낫습니다. –

+0

나는 혼란스러운 것을 가지고있다. layoutRect는 무엇입니까? 나는 그것을 이해하지 못한다 – Kross

1

사용 방법에 따라 DT_CALCRECT가 지정된 DrawText를 사용할 수 있으며 텍스트/글꼴/등을 기준으로 필요한 사각형의 크기를 계산합니다 (항상 정확하게 처리됩니다).

13

내가 확실히 모르겠지만,이 보인다 :

HDC hDC = GetDC(NULL); 
RECT r = { 0, 0, 0, 0 }; 
char str[] = "Whatever"; 
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT); 

가 작동하지 않을 수 있습니다.

+0

감사합니다. GetTextExtentPoint32와 동일한 너비를 보여줍니다. :). – Razvi

+2

이것은 GetTextExtentPoint32보다 훨씬 좋은 해결책입니다. 왜냐하면 매핑 모드가 방정식에서 벗어나기 때문입니다. 작성자가 변경해야하는 한 가지는'DrawText'에 대한 플래그입니다. 'DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE'입니다. 결과 너비는'abs (r.right - r.left);로 계산 될 수 있습니다. – c00000fd

0

Builder C++의 경우 먼저 새 TLabel을 동적으로 만들고 글꼴 특성을 변경하십시오. TLabel을 autosize로 설정하십시오. 그러면 TLabel 너비를 얻을 수 있습니다. 마녀는 문자열 폭을 픽셀 단위로 나타냅니다.

int WidthPixels (String font, int size, String text) 
{ 
    TLabel* label = new TLabel(Form1); // dynamic TLabel 
    label->AutoSize = true; 
    label->Font->Name = font; // your font 
    label->Font->Size = size; // your font size 
    label->Caption = text; // your string 
    return label->Width; 
} 

int width = WidthPixels("Times New Roman", 19 , "Hey"); 
관련 문제