2015-05-22 1 views
0

У меня проблемы с поиском ресурсов, которые объясняют, как рассчитать ширину текста строки с разными символами kearning/space-between.Вычисление ширины текста, включая пробел/кернинг между символами с помощью Delphi

Текстовая ширина может использовать размер шрифта, стили шрифта и т. Д., Но не пробел между символами? (Или кернинг, который я считаю, является специфическим очень шрифта, то есть дает разные значения пикселей зависят от шрифта, так как символы, так как они могут «Перекрытие» более или менее в зависимости от кернинга/значения расстояния)

+0

Есть ли у вас выходной текст с конкретным кернинг с использованием ExtTextOut или с использованием других средств? – MBo

+0

Просьба указать пример, который показывает потерю ширины текста. –

+0

Как вы рисуете текст со специфическими настройками кернинга? DirectWrite, GDI +? У той же библиотеки/API наверняка есть функции для вас. Или вы хотите узнать ширину обычного текста GDI? Тогда Canvas.TextWidth будет достаточно. – NGLN

ответ

2

Edit: Рекомендуется чтение: Feng Yuan "Windows Graphics Programming"

Пример TextWidth (GetTextExtentPoint32) и более сложным способом:

var 
    Len, w: Integer; 
    s: string; 
    GR: TGCPResults; 
begin 
    Canvas.Font.Size := 14; 
    s := 'A simple test string'; 
    Canvas.TextOut(0, 0, s); 
    w := Canvas.TextWidth(s); 
    Canvas.MoveTo(w, 0); 
    Canvas.LineTo(w, 30); 

    SetTextCharacterExtra(Canvas.Handle, 5); 
    Canvas.TextOut(0, 30, s); 
    w := Canvas.TextWidth(s); 
    Canvas.MoveTo(w, 30); 
    Canvas.LineTo(w, 60); 

    SetTextCharacterExtra(Canvas.Handle, 0); 
    Len := Length(s); 
    GR.lStructSize := sizeOf(GR); 
    GetMem(GR.lpOutString, (Len + 1) * sizeOf(Char)); 
    GR.lpOrder := Nil; 
    GetMem(GR.lpDx, (Len + 1) * sizeOf(Integer)); 
    GetMem(GR.lpCaretPos, (Len + 1) * sizeOf(Integer)); 
    GR.lpClass := Nil; 
    GetMem(GR.lpGlyphs, (Len + 1) * sizeOf(UINT)); 
    GR.nGlyphs := Len; 
    GR.nMaxFit := 0; 

    w := GetCharacterPlacement(Canvas.Handle, PwideChar(s), Len, 0, GR, 
    GCP_USEKERNING) and $FFFF; 
    ExtTextOut(Canvas.Handle, 0, 60, ETO_GLYPH_INDEX, nil, PChar(GR.lpGlyphs), 
    GR.nGlyphs, PINteger(GR.lpDx)); 
    Canvas.MoveTo(w, 60); 
    Canvas.LineTo(w, 90); 
    // free memory for GR members 
+0

Есть некоторые интересные функции, которые я буду искать и исследовать дальше. Благодаря :) – Tom

Смежные вопросы