Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Effektive Höhe Buchstaben und Canvas.TextHeight (https://www.delphipraxis.net/66425-effektive-hoehe-buchstaben-und-canvas-textheight.html)

aschne1 29. Mär 2006 15:23


Effektive Höhe Buchstaben und Canvas.TextHeight
 
Hallo

Mit Canvas.TextHeight kann ich die Schrifthöhe vor dem Zeichnen abfragen. Diese entspricht aber nicht genau der Distanz von oberster bis zur untersten Stelle eines Buchstabens. Wie kann ich diese Distanz berechnen? Hat jemand eine Idee?

Danke und Gruss

Flare 29. Mär 2006 15:33

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Ich hätte da so eine Vermutung, und zwar ist diese Höhe höchstwarscheinlich der Abstand vom unteren Rand zum Beispiel von "g" und dem oberen Rand von zum Beispiel "F".
Wenn das so ist, dann wäre zum Beispiel die Höhe von "F" 2/3 mal Canvas.TextHeight + 1/3.


Flare

aschne1 29. Mär 2006 15:46

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
@Flare

Ist Deine Vermutung für 'F' irgendwo dokumentiert? Ich möchte das Ganze nicht mit dem Geodreieck am TFT ausmessen.
Aber ein definierter Referenzbuchstabe (Uppercase) würde mir schon ausreichen, wenn es nicht gerade ein 'Q' ist!

Danke Dir.

Flare 29. Mär 2006 15:50

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Dokumentiert wird es schon irgendwo sein. Ich habe das F genommen, weil es irgendwie für mich der größte Buchstabe ist ^^
Ich meine im allgemeinen einen Großbuchstaben.


Flare

Flocke 29. Mär 2006 15:54

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Das kann von Schrift zu Schrift unterschiedlich sein.

1. Die Schriftart muss genug Höhe und Tiefe für alle Zeichen haben. Es muss also nicht nur ein "U" hinein passen, sondern auch ein "Ü" mit den Punkten darüber.

2. Viele Schriftarten enthalten einen Durchschuss, also einen zusätzlichen Abstand vom oberen Pixelrand zum ersten Buchstabenpixel (engl. "Internal Leading"). Siehe hier:
http://www.catch22.net/tuts/img/editor10.gif

Den Abstand kannst du so bestimmen (die Schrift muss in den Canvas gesetzt sein):
Delphi-Quellcode:
var
  tm: TTextMetric;
begin
  GetTextMetrics(Canvas.Handle, tm);
  Result := tm.tmInternalLeading;
end;

Mackhack 12. Apr 2006 19:27

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Ich nahm immer das kleine "q" als niedrigsten und das "AE" als den hoechsten Buchstaben!

wallaby 16. Okt 2006 18:04

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Hallo!

Ich bin bei der Suche nach einer Lösung auf dieses Forum gestoßen.
Und so alt ist der Thread ja nicht, sodass man ihn ruhig aufwärmen
kann. :mrgreen:

Zum Problem: Wenn ich an TextWidth einen Text übergebe, bekomme ich
die Breite des Textes in aktueller Schrift und Größe in Pixeln zurück-
geliefert. TextHeight ist es aber egal, welchen Text ich übergebe -
ob "g", "F" oder gar "." - ich erhalte immer den gleichen Wert zurück,
der wohl dem gesammten Space der Schrift entspricht (vom höchsten bis
zum tiefsten Bogen aller Zeichen). Warum übergebe ich dann überhaupt
einen String?
Im vorliegenden Fall will ich die Höhe aller Ziffern ermitteln, um
eine Zahl mit festgelegtem Abstand unter eine Grafik zu drucken.

Ich werde jetzt mal Experimente mit dem "Internal Leading" machen.
Oder ich ändere meine Ausrichtung der Schrift (derzeit BaseLine).

Danke und Gruß Patrick

xaromz 16. Okt 2006 23:09

Re: Effektive Höhe Buchstaben und Canvas.TextHeight
 
Hallo,
Zitat:

Zitat von wallaby
Zum Problem: Wenn ich an TextWidth einen Text übergebe, bekomme ich
die Breite des Textes in aktueller Schrift und Größe in Pixeln zurück-
geliefert. TextHeight ist es aber egal, welchen Text ich übergebe -
ob "g", "F" oder gar "." - ich erhalte immer den gleichen Wert zurück,
der wohl dem gesammten Space der Schrift entspricht (vom höchsten bis
zum tiefsten Bogen aller Zeichen). Warum übergebe ich dann überhaupt
einen String?

Weil TextHeight und TextWidth intern die API-Routine MSDN-Library durchsuchenGetTextExtentPoint32 aufrufen. Und diese gibt immer beide Werte (Höhe und Breite) zurück.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz