Как найти ширину строки (в пикселях) в 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");