2009-07-14 5 views
16

Можете ли вы более точно измерить ширину строки в WIN32, чем использовать функцию GetTextMetrics и использовать tmAveCharWidth * strSize?Как найти ширину строки (в пикселях) в 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

В зависимости от того, как вы используете это, вы можете использовать DrawText с указанным DT_CALCRECT, и он (он всегда делает это достаточно точно для меня) вычисляет размер требуемого прямоугольника на основе текста/шрифта/etc.

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 width witch, представляющий вашу ширину строки в пикселях.

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"); 
Смежные вопросы