2010-12-20 26 views
2

私の質問は十分にはっきりしていると思いますが、もっと説明します。単純に、RenderTextプロシージャでAntiAliasを使用している場合、TextWidth関数内で取得された値は正しくありません。適切なテキストの幅を得るために何ができますか?Graphics32のRenderTextの正確なテキスト幅を取得する方法

+0

に例を見つけるためにいくつかのグーグルを行いますが、問題を解決しましたか? – Runner

+0

はい。それはあなたが与えたコードで完璧に完了しました。ありがとうございました!!私は本当にこれが必要でした – Javid

答えて

4

独自のコードでアルゴリズムを探すことができます。彼らはまたそれを計算しなければなりません。とにかくこれは私がそれをする方法です。

function TGR32Canvas.TextWidth(const Text: string): Integer; 
var 
    TempFont: TFont; 
    TempWidth: Integer; 
begin 
    if Text <> '' then 
    begin 
    TempFont := TFont.Create; 
    try 
     TempFont.Assign(Font); 
     TempFont.Size := Font.Size shl AA_MODE; 
     TempWidth := GetTextWidth(Text, TempFont); 
    finally 
     TempFont.Free; 
    end; 
    end 
    else 
    TempWidth := 0; 

    TempWidth := (TempWidth shr AA_MODE + 1) shl AA_MODE; 
    Result := TempWidth shr AA_MODE; 
end; 

GetTextWidth関数は単純です。あなたは違ったやり方をすることができます。

function GetTextWidth(const Text: string; const Font: TFont): Integer; 
var 
    Canvas: TCanvas; 
begin 
    Canvas := TCanvas.Create; 
    try 
    Canvas.Handle := GetDC(0); 
    try 
     Canvas.Font.Assign(Font); 
     Result := Canvas.TextWidth(Text); 
    finally 
     ReleaseDC(0, Canvas.Handle); 
    end; 
    finally 
    Canvas.Free; 
    end; 
end; 
+0

あなたはそれを得ましたか? GetTextWidth関数は不明です。 – Javid

+0

忘れてしまった。私は答えを編集しました。それはおそらくよりエレガントに行うことができますが、アイデアは同じで動作します。 – Runner

+0

すごく大好き! – Javid

1
あなたはまた、Windows API関数を使用することができます

GetTextExtentPoint32 デルファイ

+0

GR32は描画に独自の技術を使用しているため、APIを使用すると正確な結果が得られないと思います。 – Runner

関連する問題