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 GDI / Canvas / gedrehter Text zentriert ausgeben (https://www.delphipraxis.net/128468-gdi-canvas-gedrehter-text-zentriert-ausgeben.html)

brechi 30. Jan 2009 11:57


GDI / Canvas / gedrehter Text zentriert ausgeben
 
Siehe Topic.
Ich möchte einen Text drehen (Canvas.Orientation, bzw via TLogFont + Escapement) und diesen zentriert an einem Punkt ausgeben. (TextOut)

Bei Textout wird ja die obere linke Koordinate vom Text angegeben. Normalerweise würd ich mittels TextExtend die Breite/Höhe ermitteln und dann die Hälfte jeweils abziehen. Aber TextExtend arbeitet auf dem noch nicht umgedrehten Text.

Beispiel:
Text: "DelphiPraxis"
Drehung: 90° (Orientation = 900)
Position: 100/100

Ausgabe gedrehter TExt wobei das i/P von DelphiPraxis in der Mitte ist
Problem: TextExtend liefert mir als Breite immer noch die Breite vom ungedrehten Text (z.B 12) wobei die Höge dann noch 1 ist. Durch die Drehung von 90° müsste es ja umgekehrt sein.


Simples Beispiel:

Delphi-Quellcode:
var
  x, y: Integer;
  s: string;
  size: TSize;
begin
  x := 100;
  y := 100;
  s := 'test_test';
  Canvas.Font.Orientation := 90 * 10; // 90°
  size := Canvas.TextExtent(s); // bezieht sich nicht auf gedrehten Text
  Canvas.TextOut(x - size.cx div 2, y - size.cy div 2, s);
  Canvas.Pixels[x, y] := clRed; // nur zum schauen ob es richtig ist
end;
Frage: Wie macht man es richtig? :)


Edit:
SetTextAlign liefert mir jetzt die horizontale Mitte, wie vertikal?

himitsu 30. Jan 2009 12:12

Re: GDI / Canvas / gedrehter Text zentriert ausgeben
 
Dann mußt du wohl über die Winkelfunktionen (Sin+Cos) deinen Startpunkt mitdrehen.

xZise 1. Feb 2009 00:04

Re: GDI / Canvas / gedrehter Text zentriert ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und wenn du nicht ganz so fit damit seit solltest, habe ich mal was kurz gezeichnet.

Der Winkel und die Textlänge in der waagerechten ist ja bekannt.
Der Sin(Alpha) ist Gegenkathete/Hypotenuse und an einem "Dreieck Mittelpunkt" - "Gedrehter Textende" - "Rechterwinkel dazu" (das grüne in der Grafik) ist die hälfte der Textlänge die Hypotenuse. Somit kann dann mit dem Sinus die Gegenkathete und damit die gedrehte Texthöhe berechnet werden.
Im gleichen Dreieck berechnet der Kosinus das Verhältnis zwischen Ankathete und Hypotenuse. Damit kann man dann die gedrehte Textlänge ermitteln.

Dann beides halbieren und zum Ursprung addieren fertig. Und standardmäßig benutzen die trigonometrischen Funktionen das Bogenmaß. Mit DegToRad kann dann ein Winkel (°) in Bogenmaß umgerechnet werden.

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 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