Как найти ширину строки (в пикселях) в WIN32

Можно ли более точно измерить ширину строки в WIN32, чем использовать функцию GetTextMetrics и использовать tmAveCharWidth * strSize?

Ответы

Ответ 1

Попробуйте использовать GetTextExtentPoint32. Это использует текущий шрифт для данного контекста устройства для измерения ширины и высоты отображаемой строки в логических единицах. Для режима отображения по умолчанию MM_TEXT, 1 логический блок - 1 пиксель.

Однако, если вы изменили режим отображения для текущего контекста устройства, логический блок может быть не таким, как пиксель. Вы можете прочитать о различных режимах отображения в MSDN. В режиме отображения вы можете преобразовать размеры, возвращаемые вам с помощью GetTextExtentPoint32 в пиксели.

Ответ 2

Я не знаю точно, но кажется, что:

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

может работать.

Ответ 3

Графика:: 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);
}

Ответ 4

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

Ответ 5

Для Builder С++ сначала создайте новый 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");