Как определить длину текста в Windows?

В моем программном обеспечении, написанном для Windows с помощью Builder C++ 6, мне нужно создать статью в формате .pdf с некоторой информацией, которую пользователь редактирует и которая хранится в базе данных. Часть этой информации должна быть нарисована внутри спроектированного прямоугольника, поэтому мне нужно проверить, какая строка символов 55max будет соответствовать только одной строке внутри прямоугольника. Если нет, то мне нужно рассчитать, где я должен указать новую строку (\n).

Обычно текст помещается внутри прямоугольника, имеющего только 55 символов, но иногда какой-то необычный текст (например, "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..."), имея одинаковое количество символов, в конечном итоге испортит все. Другими словами, я не могу использовать количество символов в строке, чтобы определить, когда дать новую строку, а скорее длину текста в пикселях (или других единицах измерения), поэтому я могу проверить, какая строка будет больше в .pdf, что это прямоугольный контейнер или нет.

Я пробовал такие функции, как GetCharABCWidths(), GetTextExtentPoint32(), но безуспешно (либо так называемые "логические единицы" менялись каждый раз, когда я использовал функцию для одной и той же строки/символа, и я не знал, как их использовать , или длина char была одинаковой, даже если они явно различались («1» по сравнению с «W») или что-то еще).

Итак, как я могу это сделать?


person Momergil    schedule 04.10.2012    source источник


Ответы (2)


В конце концов, я смог сделать то, что хотел, используя этот тип из длины строки в пикселях:

Чтобы получить более точное измерение, вы можете заполнить TextField строкой, а затем измерить ширину текста этого TextField.

Это вернуло меня к Borland C++ Builder, где я нашел функцию (Canvas->TextExtent), которая сообщает, сколько String будет занимать на холсте.

Итак, проблема решена!

person Momergil    schedule 10.10.2012

Вы также можете использовать функцию DrawText. Просто передайте в функцию флаг DT_CALCRECT. Или даже GetTextMetrics — здесь я использовал оба. Это простые, ванильные функции win32. Работает в любом компиляторе, поддерживающем программы win32, которые вы хотите попробовать. VS, GCC, Borland и т.д.

Фрагмент кода:

HDC hDC;
TEXTMETRIC textMetric;
HFONT   hFont, hOldFont;
int sizeInPpoints, lineHeight;
RECT textRect;
char *buffer = "Comprimento em pixels desta string!";

hDC = GetDC(hwnd);
sizeInPpoints = MulDiv(10, GetDeviceCaps(hDC, LOGPIXELSY), 72);
hFont = CreateFont(-sizeInPpoints, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New");
hOldFont = (HFONT)SelectObject(hDC, hFont);

GetTextMetrics(hDC, &textMetric);

lineHeight = textMetric.tmHeight; // character height in current font

textRect.left = textRect.right = textRect.top = textRect.bottom = 0;
DrawText(hDC, buffer, strlen(buffer), &textRect, DT_CALCRECT);

printf("Size of text calculated by DrawText: [%d x %d]\n", textRect.right, textRect.bottom);
printf("Height of text calculated by GetTextMetrics: %d\n", lineHeight);

Вывод:

Size of text calculated by DrawText: [280 x 16]
Height of text calculated by GetTextMetrics: 16
person enhzflep    schedule 10.10.2012
comment
Я не уверен, что это сработает; Я помню, как когда-то пытался использовать GetTextMetrics (возможно, не совсем так, как вы), и он дал то же самое значение 16; совсем небольшое совпадение? Но если у меня останется немного времени, я попробую ваш код. В любом случае, спасибо! - person Momergil; 11.10.2012