2010-12-20 10 views
2

abrufen Ich denke, meine Frage ist klar genug, aber ich erkläre mehr. Wenn wir AntiAlias ​​in der RenderText-Prozedur verwenden, ist der in der TextWidth-Funktion erhaltene Wert nicht korrekt. Was kann ich tun, um die richtige Textbreite zu erhalten?wie genaue Textbreite für RenderText in Graphics32

+0

Haben Sie lösen das Problem zu finden? – Runner

+0

ja. es ist perfekt mit dem Code getan, den du gabst. Danke nochmal!! Ich brauchte wirklich diese – Javid

Antwort

4

Sie können den Algorithmus in seinem eigenen Code suchen. Sie müssen es auch berechnen. Jedenfalls mache ich das so.

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; 

Die GetTextWidth-Funktion ist einfach. Du kannst es anders machen.

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

von welcher Einheit hast du es bekommen? GetTextWidth-Funktion ist nicht identifiziert. – Javid

+0

Vergessen, es zu zeigen. Ich habe die Antwort bearbeitet. Es kann wahrscheinlich eleganter gemacht werden, aber die Idee ist die gleiche und es funktioniert. – Runner

+0

DANKE SOOOO VIEL MATE! – Javid

1

Sie können auch die API-Funktion von Windows verwenden GetTextExtentPoint32 einige google Sie zB auf Delphi

+0

GR32 verwendet seine eigenen Techniken zum Zeichnen, also glaube ich nicht, dass die Verwendung der API Ihnen genaue Ergebnisse liefern würde. – Runner