![]() |
Länge eines Textes in Pixel ermitteln
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 |
AW: Länge eines Textes in Pixel ermitteln
Nach langer Recherche endlich was passendes gefunden. DT_CALCRECT heißt das Zauberwort. Für alle, die das selbe Problem haben:
Delphi-Quellcode:
FFont ist mein Feld vom Typ ID3DXFont.
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; |
AW: Länge eines Textes in Pixel ermitteln
Zitat:
Beim 3D hab ich eher noch ein anderes Problemchen :gruebel: 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 |
AW: Länge eines Textes in Pixel ermitteln
Zitat:
Dort wird GetTextExtendPoint32 benutzt: ![]() |
AW: Länge eines Textes in Pixel ermitteln
Zitat:
Ein Label z.B. hat aber kein eigenes Handle, da es kein Fenster im Sinne von Windows ist. Und was das betrift: Zitat:
Dies hier sollte dagegen universell einsetzbar sein, egal ob für die Beschriftung von Label, Panel, Button, Statusbar, etc:
Code:
Beispiel:
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;
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; |
AW: Länge eines Textes in Pixel ermitteln
@ASM
Zitat:
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; |
AW: Länge eines Textes in Pixel ermitteln
Zitat:
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. |
AW: Länge eines Textes in Pixel ermitteln
Zitat:
@ASM: Dein Weg erfordert mir ein wenig zu arg Properties, um so universell zu sein, wie du es darstellst. |
AW: Länge eines Textes in Pixel ermitteln
@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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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