AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Länge eines Textes in Pixel ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Länge eines Textes in Pixel ermitteln

Ein Thema von Zacherl · begonnen am 27. Nov 2011 · letzter Beitrag vom 27. Nov 2011
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 14:40
Hey Leute,

gibt es irgendeine API, mit der ich die Länge eines Textes für eine bestimmte Font und bestimmte Parameter (Bold, Italic, etc) ermitteln kann? Habe bisher nur Beispiele gefunden, die TCanvas verwenden.

Genauer gesagt handelt es sich um eine ID3DXFont, aber wenn es für DirectX direkt keine Methode gibt, dann erzeuge ich die Font notfalls nochmal auf GDI Ebene und ermittele dort die Länge.

Viele Grüße
Zacherl
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 15:25
Nach langer Recherche endlich was passendes gefunden. DT_CALCRECT heißt das Zauberwort. Für alle, die das selbe Problem haben:

Delphi-Quellcode:
function TDXFont.GetTextHeight(Text: AnsiString): Integer;
var
  Rect: TRect;
begin
  FFont.DrawTextA(nil, PAnsiChar(Text), Length(Text), @Rect, DT_CALCRECT,
    FColor);
  Result := Rect.Height;
end;

function TDXFont.GetTextWidth(Text: AnsiString): Integer;
var
  Rect: TRect;
begin
  FFont.DrawTextA(nil, PAnsiChar(Text), Length(Text), @Rect, DT_CALCRECT,
    FColor);
  Result := Rect.Width;
end;
FFont ist mein Feld vom Typ ID3DXFont.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 15:33
Zitat:
Nach langer Recherche ...
Dazu gab es in letzter Zeit einige Threads und davor gab es noch viel mehr...

Beim 3D hab ich eher noch ein anderes Problemchen

Die angezeigte Schriftgröße hängt ja nicht nur von der Schroftgröße ab.

- Position des Textes
- Position der Kamera
- Zoomfaktoren und was weiß ich nicht alles
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 15:54
Nach langer Recherche endlich was passendes gefunden.
Die hättest du dir auch sparen können, indem du einfach mal nachgeschaut hättest wie Delphi das in TCanvas macht.

Dort wird GetTextExtendPoint32 benutzt:
http://msdn.microsoft.com/en-us/library/dd144938.aspx
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 21:46
Die hättest du dir auch sparen können, indem du einfach mal nachgeschaut hättest wie Delphi das in TCanvas macht.
Das benötigt aber "A handle to the device context." [Zitat msdn microsoft].
Ein Label z.B. hat aber kein eigenes Handle, da es kein Fenster im Sinne von Windows ist.

Und was das betrift:
"Nach langer Recherche endlich was passendes gefunden. DT_CALCRECT heißt das Zauberwort. Für alle, die das selbe Problem haben:"
Das ist ja aber äußerst speziell und nicht universell verwendbar, allein schon deshalb, weil nicht alle beschriftbaren Objekte ein Canvas haben (wie z.B. Labels).

Dies hier sollte dagegen universell einsetzbar sein, egal ob für die Beschriftung von Label, Panel, Button, Statusbar, etc:
Code:
uses TypInfo;

type
  tTextSizeInPixel = record
    WidthInPixel, HeightInPixel: integer;
  end;
 
{...} 

function TForm1.GetTextSizeInPixel(obj: TObject; objFont: TFont; objText: string): tTextSizeInPixel;
var
  BM: TBitmap;
begin
  with result do
  begin
    widthInPixel := 0;
    heightInPixel := 0;
  end;
  // falls obj kein entspr. Property hat, ist alles weitere obsolet
  if GetPropInfo(Obj.ClassInfo, 'Font') = nil then exit;
  if GetPropInfo(Obj.ClassInfo, 'Caption') = nil then
    if GetPropInfo(Obj.ClassInfo, 'Text') = nil then exit;
  BM := TBitmap.Create;
  try
    BM.Canvas.Font := objFont;
    with result, BM.Canvas do
    begin
      widthInPixel := TextWidth(objText);
      heightInPixel := TextHeight(objText);
    end;
  finally
    BM.Free;
  end;
end;
Beispiel:
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // z.B.
  with Edit1 do
  begin
    Font.size := 14;
    Text := 'Forum Delphi-Praxis';
  end;
  with Label1 do
  begin
    Font.size := 12;
    Caption := 'GetTextSizeInPixel';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    // mit einem Editfeld:
    with Edit1, GetTextSizeInPixel(Edit1, Font, text) do
      showmessage(format('Edit1 Text = %s'#13#10 +
        'Font Size: %d'#13#10 +
        'Text Höhe = %d Pixel, Weite = %d Pixel',
        [text, font.size, HeightInPixel, WidthInPixel]));

    // oder mit einem Label:
    with Label1, GetTextSizeInPixel(Label1, Font, caption) do
      showmessage(format('Label1 Caption = %s'#13#10 +
        'Font Size: %d'#13#10 +
        'Text Höhe = %d Pixel, Weite = %d Pixel',
        [caption, font.size, HeightInPixel, WidthInPixel]));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 22:28
@ASM
Zitat:
allein schon deshalb, weil nicht alle beschriftbaren Objekte ein Canvas haben (wie z.B. Labels).
Nicht public oder published heißt nicht daß es nicht da wäre
Delphi-Quellcode:
type
  THackGraphicControl=Class(Controls.TGraphicControl)
     public
     Property Canvas;
  End;
.....

procedure TForm1.Button1Click(Sender: TObject);
begin
 THackGraphicControl(Label1).Canvas.Ellipse(0,0,10,10);
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 23:21
Nicht public oder published heißt nicht daß es nicht da wäre
Gut, soweit akzeptiert. Das hatte ich jetzt bedacht.

Aber ein TGraphicControl hat zwar ein Canvas (zumindestens über die Hilfsklasse THackGraphicControl erreichbar), jedoch kein Handle; dagegen ein TWinControl zwar ein Handle, aber kein Canvas. Also müsste man - je nach verwendetem Objekt - eine andere Funktion zur Berechnung der Pixel heranziehen.

Warum also nicht gleich eine universelle Funktion, die von vornherein unabhängig von dieser unterschiedlichen Herleitung eines Objekts ist.

Außerdem kann man in meiner oben beschriebenen Funktion die Pixel über einen String berechnen lassen, der zunächst noch gar nicht im Objekt selbst definiert ist, wodurch man ggf. zunächst die für diesen String benötigten Pixel berechnen kann und danach das Beschriftungsfeld des Objekts in Länge und Höhe oder seine Font.size entsprechend anpassen kann (nicht alles hat ja eine Autosize Property), um es dann mit eben diesem String zu belegen.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 23:27
[...] Genauer gesagt handelt es sich um eine ID3DXFont, aber wenn es für DirectX direkt keine Methode gibt [...]
ID3DXFont.DrawText() mit DT_CALCRECT ist schon der richtige Weg hier, VCL und WinAPI Gelöt haben nix mit dem Problem zu tun.

@ASM: Dein Weg erfordert mir ein wenig zu arg Properties, um so universell zu sein, wie du es darstellst.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Länge eines Textes in Pixel ermitteln

  Alt 27. Nov 2011, 23:33
@asm
warum so pessimistisch ... alles was gemalt wird hat ein Canvas (lassen wir OGL und Directx mal aussen vor)
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
c:TCanvas;
begin
 c:=TCanvas.Create;
 try
 c.Handle := GetDC(Button1.Handle);
 c.Ellipse(0,0,10,10);
 finally

   c.Free
 end;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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