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