Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Texthöhe ermitteln (https://www.delphipraxis.net/170121-texthoehe-ermitteln.html)

Amateurprofi 1. Sep 2012 12:15

Texthöhe ermitteln
 
Um die Höhe eines Textes zu ermitteln, benutze ich folgende Funktion

Delphi-Quellcode:
FUNCTION GetFontHeight(FontHandle:HFont):integer;
var DC:HDC; OldFont:HFONT; Metrics:TTextMetric;
begin
   DC:=GetDC(0);
   try
      OldFont:=SelectObject(DC,FontHandle);
      GetTextMetrics(DC, Metrics);
      SelectObject(DC,OldFont);
   finally
      ReleaseDC(0,DC);
   end;
   Result:=Metrics.tmHeight;
end;

Nun möchte ich die Höhe des Textes bei gegebenem Font, aber mit einem anderen Font.Size und/oder Font.Style ermitteln OHNE den Font.Size/Style des betreffenden Controls zu verändern.

Wie kann ich das am einfachsten realisieren?

p80286 1. Sep 2012 12:19

AW: Texthöhe ermitteln
 
Ich würde eine unsichtbare andere Canvas dafür benutzen.

Gruß
K-H

Bjoerk 1. Sep 2012 12:19

AW: Texthöhe ermitteln
 
Wie wär's mit einem Label?

himitsu 1. Sep 2012 12:56

AW: Texthöhe ermitteln
 
PS: Schonmal in die CodeLib geguckt? :roll:

[CL]Text Höhe[/CL]

Jenachdem wie wann/ob, die Komponente den Font setzt (für die Anzeige), kann man entweder direkt das Canvas dieses Controls nutzen, Font+Size+Style setzen und die Texthöhe auslesen (also wenn das Control dem Canvas für die Anzeige, beim Anzeigen den Font neu zuweist), oder man nutzt eben ein anderes Canvas.

Amateurprofi 1. Sep 2012 14:23

AW: Texthöhe ermitteln
 
Zitat:

Zitat von Bjoerk (Beitrag 1180972)
Wie wär's mit einem Label?

Zitat:

Zitat von p80286 (Beitrag 1180971)
Ich würde eine unsichtbare andere Canvas dafür benutzen.

Zitat:

Zitat von himitsu (Beitrag 1180974)
oder man nutzt eben ein anderes Canvas.

Danke, aber genau das will ich alles nicht.
Ich möchte keine anderen Komponenten, ob sichtbar oder unsichtbar benutzen, sondern nur für den aktuellen Font eines Controls, aber mit ggfs. anderem Size/Style die Texthöhe bestimmen.
Also eine Funktion analog GetFontHeight aus #1 mit zusätzlichen Parametern Size und Style, die die Schrifthöhe ermittelt, OHNE den Font.Size/Style des Controls zu ändern und ohne irgend ein anderes Control zu benutzen.


Zitat:

Zitat von himitsu (Beitrag 1180974)
PS: Schonmal in die CodeLib geguckt?.

Ja, hab ich. War aber nicht so ergiebig.

himitsu 1. Sep 2012 15:05

AW: Texthöhe ermitteln
 
Die Funktionen, zum Messen der Text-Höhe/Breite brauchen nunmal einen Canvas (der einen DeviceContext kapselt) oder einen DeviceContext.

Also entweder nutzt du den Canvas/DC des Controls und änderst dort den Font
oder du mußt eben einen anderen Canvas/DC benutzen (wofür sich in der CL passende Codes finden lassen).

Wenn du wissen willst, wie schwer ein Auto ist, dann mußt du dieses zu einer Wage bringen
oder du nimmst dir ein vergleichbares Auto und schaffst das zur Waage. :roll:
(oder du kennst jemanden der weiß wie schwer es ist)

p80286 1. Sep 2012 22:38

AW: Texthöhe ermitteln
 
Man könnte auch sagen "wasch mich aber mach mich nicht nass".
Ist ja nicht soganz unüblich solche Forderungen zu stellen.

Gruß
K-H

Amateurprofi 2. Sep 2012 01:34

AW: Texthöhe ermitteln
 
Ich hab es jetzt so gelöst:
(Ist nicht ganz das was ich ursprünglich wollte, aber es funktioniert.)
Delphi-Quellcode:
FUNCTION GetFontHeight(AFont:TFont; ASize:integer; AStyles:TFontStyles):integer;
var f:TFont; DC:HDC; OldFont:HFONT; Metrics:TTextMetric;
begin
   f:=TFont.Create;
   DC:=GetDC(0);
   try
      try
         f.Assign(AFont);
         f.Size:=ASize;
         f.Style:=AStyles;
         OldFont:=SelectObject(DC,f.Handle);
         GetTextMetrics(DC, Metrics);
         SelectObject(DC,OldFont);
         Result:=Metrics.tmHeight;
      except
         On Exception do result:=0;
      end;
   finally
      ReleaseDC(0,DC);
      f.Free;
   end;
end;
Zitat:

Zitat von p80286 (Beitrag 1180999)
Man könnte auch sagen "wasch mich aber mach mich nicht nass".
Ist ja nicht soganz unüblich solche Forderungen zu stellen.

Ich stellte keine Forderungen, sondern nur eine Frage.
Zitat:

Zitat von himitsu (Beitrag 1180979)
Wenn du wissen willst, wie schwer ein Auto ist, dann mußt du dieses zu einer Wage bringen
oder du nimmst dir ein vergleichbares Auto und schaffst das zur Waage.
(oder du kennst jemanden der weiß wie schwer es ist)

Wenn ich aber keine Waage habe, oder aus irgendwelchen Gründen keine Waage benutzen möchte, dann ermittle ich für alle Materialien aus denen das Auto besteht, das Volumen und errechne über das jeweilige spezifische Gewicht die Masse.

Falls doch noch jemand einen Weg kennt, wie das besser zu lösen ist, bin ich für jeden Hinweis dankbar.

Popov 2. Sep 2012 01:37

AW: Texthöhe ermitteln
 
Guck dir evtl. Font.Height an. Es sagt nicht aus wie viel Canvas Pixel Höhe die Schrift hat, inc. Leerräume, sondern die Schrift selber. Vielleicht bringt es dir was.

Ist aber schon lange her, dass ich mal etwas damit gemacht habe. Kann auch sein, dass ich Blödsinn erzähle.

Bjoerk 2. Sep 2012 08:30

AW: Texthöhe ermitteln
 
Das ist jetzt aber völlig unlogisch. Wenn du schon die Graphics einbinden mußt (wegen TFont), kannst du’s auch gleich so (wie der Rest der Welt auch) machen:
Delphi-Quellcode:
function GetTextHeight(const FontName: string; const FontSize: integer;
  const FontStyle: TFontStyles = []): integer;
var
  Bitmap: TBitmap;
begin
  // TCanvas.TextHeight gibt die Höhe der Schriftart, die Oberlänge plus der
  // Unterlänge, nicht die eigentliche Höhe des angegebenen Strings zurück
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Canvas.Font.Name:= FontName;
    Bitmap.Canvas.Font.Size:= FontSize;
    Bitmap.Canvas.Font.Style:= FontStyle;
    Result:= Bitmap.Canvas.TextHeight('Test');
  finally
    Bitmap.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.
Seite 1 von 2  1 2      

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