![]() |
Exakte(re) Breite eines via TextOut ausgegebenen Strings
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:
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).
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); ... 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 ![]() 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!) |
Re: Exakte(re) Breite eines via TextOut ausgegebenen Strings
|
Re: Exakte(re) Breite eines via TextOut ausgegebenen Strings
Zitat:
|
Re: Exakte(re) Breite eines via TextOut ausgegebenen Strings
Zitat:
Delphi-Quellcode:
procedure TMyPage.SetFont(AFont: TFont);
begin with C.Font do begin Assign(AFont); Size := fmmFontSize * 10 div PixelsPerInch; FontHeight := Abs(Height); Font.PixelsPerInch := GetDeviceCaps(C.Handle, LOGPIXELSY); GetObject(Handle, sizeof(lf), @lf); lf.lfEscapement := DrawAngle * 10; lf.lfOrientation := DrawAngle * 10; lf.lfWidth := 100 * lf.lfHeight div (fFontWidth); lf.lfQuality := ANTIALIASED_QUALITY; NewFont := CreateFontIndirect(lf); OldFont := SelectObject(C.Handle, NewFont); end; end; Zitat:
(EDIT): Auf ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz