Einzelnen Beitrag anzeigen

salat

Registriert seit: 2. Apr 2007
3 Beiträge
 
#1

Exakte(re) Breite eines via TextOut ausgegebenen Strings

  Alt 9. Jul 2007, 12:11
Hallo Delphi-Praktiker,

ich kämpfe mit Delphi 2005 (Win32) an folgendem Problem:

Es soll ein Text passend auf ein Blatt gedruckt werden. Falls der Text zu breit wird, stauche ich die Schrift:

Minicodeschnippsel:
Delphi-Quellcode:
lf: TLogfont;
myfontWidth, tempwidth, i: Integer;
Textfeld : String;
faktor : Real;

...
lf.lfWidth := myfontWidth;
lf.lfQuality := ANTIALIASED_QUALITY;
...
faktor := 200.0 / (i);
tempWidth := ceil((C.TextWidth(Textfeld) * faktor);
...
Der Text wird per Schleife an die maximale Seitenbreite angepasst (gestaucht). Dabei muss ich mittels eines Streckfaktor momentan die Breite der Zeile in Pixeln berechnen, weil Canvas.TextWidth die geänderte Breite nicht die Bohne interessiert (Man kann sich ein Rectangle drum ausgeben lassen - das bleibt eben "groß"). Außerdem scheint TextWidth recht unpräzise zu sein - bei manchen TrueType-Fonts kommen absurde Werte raus (die Typographen wissen warum).

Nun gibt es bei .NET einige nette Funktionen im Berech GDI+ - z.B. läßt sich anscheinend das Padding in der BoundingBox mittels TextFormatFlags ausschalten (siehe Beispielprogramm von MS unter http://msdn.microsoft.com/msdnmag/is...g/default.aspx ).
Ich vermute, wäre die Box korrekt, stimmten auch die Ausgaben von TextWidth - also:

Kriegt man das auch direkt unter Win32 hin?

Was ich sonst schon gesehen habe: Den Text auf ein Bitmap ausgeben und dann die Bitmap "vermessen".. Das scheint allerding wirklich nicht sehr effizient zu sein.

Für jeden Tipp dankbar

salat (der grüne!)
  Mit Zitat antworten Zitat