2015-05-22 68 views
0

我遇到麻煩,找到解釋如何計算具有不同字符間距的字符串的文本寬度的任何資源。使用Delphi計算字符之間包含空格/字距的文本寬度

Textwidth可以使用字體大小,字體樣式等字符間的空格嗎? (或者,字距調整我相信是非常字體特定的,即賦予不同的像素值取決於字體,因爲字符,因爲它們可以「重疊」或多或少取決於字距調整/間距值)

+0

你使用ExtTextOut或使用其它方式具體字距調整輸出文本:Feng Yuan "Windows Graphics Programming"

文本寬度(GetTextExtentPoint32)和更復雜的方法的實施例? – MBo

+0

請提供一些顯示textwidth失敗的示例。 –

+0

如何繪製具有特定字距調整設置的文本? DirectWrite,GDI +?相同的庫/ API肯定有你的功能。或者你想知道正常的GDI文本的寬度?然後Canvas.TextWidth就足夠了。 – NGLN

回答

2

編輯:推薦讀:

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

相關問題