AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX.Graphics.TCanvas.FillText drehen

Ein Thema von himitsu · begonnen am 3. Sep 2025 · letzter Beitrag vom 3. Sep 2025
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 13:36
Tachchen,

gibt es wirklich keine Möglichkeit für TCanvas.FillText (FMX) einen Winkel anzugeben?

* ja, beim Skia geht es, aber Skia für OnCustomDraw einer Nicht-Skia-Komponente?
* und ansonsten fand ich nur Varianten auf ein Bitmap zu schreiben, das dann zu drehen und anschließend auf den eigentlichen Canvas zu kopieren

* und auf ein TImage zu malen und das in der Anzeige zu drehen (RotationAngle), ist hier auch keine Lösung (z.B. den Text einer Caption/Zelle in Grid)


90°, 180°, 270° wären für den Anfang ausreichend, aber natürlich gibt es bestimmt irgendwelche, die einen freien Winkel nuzen würden wollen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
160 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 13:43
Die KI der Google-Suche spuckt dazu aus

Delphi-Quellcode:
// Example for FireMonkey
var
  Angle: Single;
  R: TRectF;
  Matrix: TMatrix;
begin
  Canvas.Fill.Color := TAlphaColors.Black;
  Angle := -ArcTan2(ClientHeight, ClientWidth); // Calculate angle
  R := ClientRect;
  Matrix := CreateRotationMatrix(Angle);
  Canvas.SetMatrix(Matrix); // Apply the rotation matrix
  Canvas.FillText(R, 'Rotated FMX Text', False, 1, [], TTextAlign.taLeading, TTextAlign.taTrailing);
end;
Ich hab's nicht getestet, da ich derzeit kein FMX verwende.

Grüsse
Uli
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 13:54
paar kleine Änderungen ....
Delphi-Quellcode:
uses
  System.Math, System.Math.Vectors; // FMX.Filter.Custom: AffineCreateRotationMatrix

procedure TForm28.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var
  Angle: Single;
  R: TRectF;
  Matrix: TMatrix;
begin
  Canvas.Fill.Color := TAlphaColors.Black;
  Angle := -ArcTan2(ClientHeight, ClientWidth); // Calculate angle
  R := ClientRect;
  Matrix := CreateRotationMatrix(Angle);
  Canvas.SetMatrix(Matrix); // Apply the rotation matrix
  Canvas.FillText(R, 'Rotated FMX Text', False, 1, [], TTextAlign.Leading, TTextAlign.Trailing);
end;
aber CreateRotationMatrix gibt es nicht, oder nicht mehr (und AffineCreateRotationMatrix ist wohl was Anderes)

und die Hilfe
https://docwiki.embarcadero.com/Libr...nvas.SetMatrix
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
687 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 14:00
darüber finde ich aber wiederum System.Math.Vectors.TMatrix und da gibt es https://docwiki.embarcadero.com/Libr...CreateRotation

vllt hilft dir das?
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de

Geändert von joachimd (Heute um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 14:43
Dann schau ich heute abend daheim nochmal in Ruhe danach.

Hatte vor mehreren Tagen nach sowas gesucht und es dann erstmal aufgegeben/gelassen.
Aber, als ich gestern Abend nochmal an jenem Projekt was geändert hab, war mir das wieder in den Sinn gekommen (hatte angefangen eine DemoForm zu basteln, wo auch Labels drauf sind)
und ich dachte ich frag mal ... vielleicht findet sich ja was für heut Abend (oder Wochenende).
https://www.delphipraxis.net/217731-...ml#post1551367
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
687 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 14:47
müsste vermutlich über

  Canvas.SetMatrix(Canvas.Matrix.CreateRotation(Angle)); zu lösen sein.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 14:53
Ich sag schonmal Danke (falls es dann geht )



es könnte alles so einfach sein

Eine DEMO in der Hilfe, die aus mehr als einer Funktion / paar Codezeilen beseteht
https://docwiki.embarcadero.com/Code...anvas_(Delphi)
und dann kommt niemand auf die Idee sie in den Demos abzulegen
C:\Users\Public\Documents\Embarcadero\Studio\23.0\Samples\
https://github.com/Embarcadero/RADStudio12Demos

oder die sinnloseste "DEMO" der Welt (siehe Screenshot) :
C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\FMXControlStyleViewer.exe
https://embt.atlassian.net/servicede...tal/1/RSS-4015
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
949 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: FMX.Graphics.TCanvas.FillText drehen

  Alt Heute, 17:54
Ich nutze bei mir die folgende Funktion, dürfte dem oben kommunizierten entsprechen:

Delphi-Quellcode:
class procedure TDrawUtils.drawRotatedText(Canvas: TCanvas; x,y,xw,angle: Single; color: TAlphaColor; HTextAlign, VTextAlign: TTextAlign; const S: String);
var
  W: Single;
  H: Single;
  R: TRectF;
  SaveMatrix: TMatrix;
  Matrix: TMatrix;
begin
  W := Canvas.TextWidth(S);
  H := Canvas.TextHeight(S);
  r:=RectF(x,y,x+w,y+h);
  if (angle=270) then
    x:=x+((xw-(h*0.25))*0.5);
  case HTextAlign of
    TTextAlign.Center: R.Left := -W / 2;
    TTextAlign.Leading: R.Left := 0;
    TTextAlign.Trailing: R.Left := -W;
  end;
  R.Width := W;
  case VTextAlign of
    TTextAlign.Center: R.Top := -H / 2;
    TTextAlign.Leading: R.Top := 0;
    TTextAlign.Trailing: R.Top := -H;
  end;
  R.Height := H;
  SaveMatrix:=Canvas.matrix;
  matrix:=TMatrix.CreateRotation(DegToRad(angle));
  matrix.m31:=x;
  matrix.m32:=y;
  Canvas.MultiplyMatrix(matrix);
  Canvas.Stroke.Color := color;
  Canvas.Fill.Color := color;
  Canvas.Stroke.Kind := TBrushKind.Solid;
  Canvas.Stroke.Thickness := 1;
  Canvas.FillText(R, S, False, 1, [], HTextAlign, VTextAlign);
  Canvas.SetMatrix(SaveMatrix);
end;
  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 18:29 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