Im Delphi Quellcode hatte ich dazu eine Näherungs-Funktion gefunden:
Delphi-Quellcode:
function GetAveCharSize(Canvas: TCanvas): TPoint;
var
I: Integer;
Buffer: array[0..51] of Char;
begin
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
Result.X := Result.X div 52;
end;
Die ist aber je nach verwendeten Zeichen in der Zeile relativ ungenau.
Gelesen hatte ich über folgende Vorgehensweise:
Erste Hälfte String testen.
-> zu kurz
Zweite Hälfte teilen, zufügen neu testen
-> zu lang
Erste Hälfte nochmal halbieren und testen
usw. bis man man nur noch ein unteilbares Zeichen hat.
Hoffe das Prinzip ist klar, Code kann ich dazu leider keinen bei mir finden.