Мне нужно вычислять ширину текста таким образом, чтобы ширина всего слова была равна сумме ширин отдельных символов или слов. Это мне нужно для того, чтобы выводить текст по частям. Как форматированный текст, у которого текущий фрагмент отличается по стилю, размеру и т.п. от предыдущего. И нужно знать с какой позиции начинать отрисовку.
Для простоты возьмем двухсимвольный текст: "Ye" (латинская)
Вызываем DrawText с флагом DT_CALCRECT
DrawText(DC, Data, Len, RC, DT_SINGLELINE or DT_CALCRECT);
Width:= RC.Width;
и получаем ширину этого слова: Width = 40.
Окей.
Если я вычислю ширину той же функцией для каждого символа этой строки
Width := 0;
while Data < DataEnd do
begin
DrawText(DC, Data^, 1, RC, DT_SINGLELINE or DT_CALCRECT);
Inc(Width, RS.Width);
Inc(Data)
end;
то получу общую ширину: Width = 43;
А именно: для первого символа 23, для второго 20.
Выведу текст на канвас обоими способами и получу такой результат:
Сверху - слово целиком. Снизу - посимвольно.
Дело в том, что когда слово выводится целиком, то второй символ как-бы немного заползает под первый.
---
Идем дальше.
Можно вычислить расстояния у символов: A - Перед глифом, B -ширина глифа, C -после глифа.
Интервал A или C может быть отрицательным, чтобы указать нависающие элементы или выступы.
Вычисляем:
GetCharABCWidths(DC, Ord('Y'), Ord('Y'), ABC[0])
Для "Y" имеем: A = 0; B = 23; C = 0;
GetCharABCWidths(DC, Ord('e'), Ord('e'), ABC[0])
Для "e" имеем: A = 1; B = 18; C = 1;
И отрицательных значений я не вижу от слова совсем! А "нависание" есть.
Вопросов больше, ответов нет. Если кто сталкивался или знает подскажите)
Спасибо)