IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Afficher un texte selon un angle donné sous Firemonkey


Sujet :

Composants FMX Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 24
    Points
    24
    Par défaut Afficher un texte selon un angle donné sous Firemonkey
    Bonjour à tous,

    Je fais appel à vos lumières pour m'aider à afficher sous Firemonkey un texte selon un angle donné, pour l'instant 90°.
    Dans l'aide Embarcadero, il est suggérer d'utiliser TTextLayout, mais je ne vois pas bien comment faire pour obtenir une rotation de texte avant de le dessiner sur un canevas.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Ma première réaction : Pour afficher un texte, utiliser la propriété RotationAngle et RotationCenter du TLabel ou du TText mais cela me parait tellement évident qu'il doit y avoir une question sous-jacente.
    Ma seconde, quand je lis "dessiner sur un canevas", c'est de penser à Skia4Delphi et son TSkLabel. Étant encore novice dans le domaine de la manipulation/modification d'image je laisse le soin de lire la doc de ce composant.

    P.S. un lien sur "Dans l'aide Embarcadero, il est suggéré d'utiliser TTextLayout" aurait certainement permis de mieux situer le contexte
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    Voici un petit exemple
    Nom : Capture d'écran 2024-02-12 090036.png
Affichages : 161
Taille : 4,0 Ko
    J'ai mis une petite bibliothèque te permettant de tourner/déplacer les objets avec la souris
    Ce qui est important ce sont les dummies et leur position :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    object Dummy1: TDummy
      Position.Y = -6.420
      Position.Z = -17.64
      RotationAngle.X = 340.0
      RotationAngle.Z = 90.0
      Width = 1.000000000000000000
      Height = 1.000000000000000000
      Depth = 1.000000000000000000
      TwoSide = True
      object Dummy2: TDummy
        Position.Y = 1.000000000000000000
        Width = 1.000000000000000000
        Height = 1.000000000000000000
        Depth = 1.000000000000000000
        object Layer3D1: TLayer3D
          Height = 1.000000000000000000
          Resolution = 200
          RotationAngle.X = 270.000000000000000000
          StyleLookup = 'backgroundstyle'
          Transparency = True
          Width = 1.000000000000000000
          object Label1: TLabel
            Position.X = 8.000000000000000000
            Position.Y = 64.000000000000000000
            Size.Width = 65.000000000000000000
            Size.Height = 17.000000000000000000
            Size.PlatformDefault = False
            Text = 'essai'
          end
        end
      end
    end
    Fichiers attachés Fichiers attachés

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    @SergioMaster :
    L'utilisation des propriétés RotationAngle et RotationCenter d'un TText conviendrait parfaitement en effet si je devais utiliser un objet visuel, mais il s'agit pour moi de dessiner un texte inversé à 90° sur le canevas d'une Paintbox. Voici l'effet recherché : j'ai un programme qui affiche une activité mensuelle sous forme d'oscilloscope, et je souhaite faire apparaître la date à chaque nouvelle année (représentée par une zone en teinte grisâtre).

    Nom : ActOscillo2.jpg
Affichages : 144
Taille : 12,8 Ko

    @AlWeber :
    Merci pour ton exemple, instructif, mais comment puis-je vraiment en tirer profit pour parvenir au résultat décrit ci-dessus?

    Merci une nouvelle fois à tous les deux pour vos réponses.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 24
    Points
    24
    Par défaut Un début de solution en utilisant une matrice... à améliorer
    Bonsoir,

    En travaillant mon code, je suis parvenu à une solution qui pourrait me convenir si je renonçais à faire pivoter mes années selon un angle donné.

    Toutefois, encouragé par quelques recherches glanées sur Internet, j'ai adapté un bout de code utilisant TMatrix et, par tâtonnements successifs, je suis arrivé à ceci :

    Nom : TexteInverséA90Degrés.jpg
Affichages : 113
Taille : 6,2 Ko

    Reconnaissez que l'objectif est atteint ! Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
      p1 := TPointF.Create(200, 150);
      p2 := p1;
     
      Canvas.Font.Size := 20;
     
      th := Canvas.TextHeight(S) / 2;
      tw := Canvas.TextWidth(S) / 2;
     
      Canvas.Fill.Color := TAlphaColors.Black;
      R := RectF(p1.X - tw, p1.Y - th, p1.X + tw, p1.Y + th);
      Canvas.FillText(R, S, false, 1, [], TTextAlign.Center, TTextAlign.Center);
     
      Canvas.Fill.Color := TAlphaColors.Maroon;
      R := RectF(p2.X - tw, p2.Y - th, p2.X + tw, p2.Y + th);
     
      OriginalMatrix := Canvas.Matrix;
     
      Matrix := Canvas.Matrix * TMatrix.CreateTranslation(-409, 55);
      Matrix := Matrix * TMatrix.CreateRotation(DegToRad(-90));
     
      Canvas.SetMatrix(Matrix);
      Canvas.FillText(R, S, False, 1, [], TTextAlign.Trailing, TTextAlign.Trailing);
     
      Canvas.SetMatrix(OriginalMatrix);
    Sauf que... je suis arrivé au bon résultat en affectant arbitrairement -409 et 55 comme coordonnées d'une translation sur un point défini en X = 200 et Y = 150. Comment obtenir la même chose par programmation ?

    En cherchant sur le forum, j'ai récupéré ici une solution proposée par Cirec que j'ai adapté à mon code de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Matrix := Canvas.Matrix * TMatrix.CreateTranslation(200, 150);
      Matrix := Matrix.Inverse * TMatrix.CreateRotation(DegToRad(-90)) * Matrix;
    Et voilà ce que çà donne :

    Nom : TexteInverséA90DegrésCirec.jpg
Affichages : 110
Taille : 6,3 Ko

    J'approche manifestement du résultat final, mais ma connaissance et ma compréhension des matrices sont bien trop limitées pour que je puisse l'atteindre sans votre aide.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu dois surement trouver le centre de ton texte par un FMX.Graphics.TCanvas.TextWidth et FMX.Graphics.TCanvas.TextHeight
    Et Comme souvent, faut connaitre aussi le coin Top Left, qui se calcule à partir du centre, cela doit ça la bonne translation

    D'ailleurs, à toi de voir si il est plus simple de faire d'abord la Translation puis la Rotation ou alors l'inverse (en inversement d'avance le X -> -Y )
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    Nom : Capture d'écran 2024-02-16 122020.jpg
Affichages : 99
Taille : 9,1 Ko

    contenu du dfm en mode text. Tu peux faire un copier coller dans une fiche vierge du contenu si dessous. Il n'y a pas besoin de code. Les dummy remplacent les opérations de matrice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
      object Viewport3D1: TViewport3D
        Align = Client
        Size.Width = 798.000000000000000000
        Size.Height = 480.000000000000000000
        Size.PlatformDefault = False
        object Light1: TLight
          Color = claWhite
          LightType = Directional
          SpotCutOff = 180.000000000000000000
          Position.X = -8.000000000000000000
          Position.Y = -6.000000000000000000
          RotationAngle.X = 315.000000000000000000
          Width = 1.000000000000000000
          Height = 1.000000000000000000
          Depth = 1.000000000000000000
          Quanternion = '(-0.382682263851166,0,0,0.923879981040955)'
        end
        object Dummy1: TDummy
          Position.Y = -6.420000076293945000
          Position.Z = -17.639999389648440000
          RotationAngle.X = 340.000000000000000000
          RotationAngle.Z = 90.000000000000000000
          Width = 1.000000000000000000
          Height = 1.000000000000000000
          Depth = 1.000000000000000000
          TwoSide = True
          Quanternion = '(-0.573576271533966,0,0,-0.819152057170868)'
          object Dummy2: TDummy
            Position.Y = 0.800000011920929000
            RotationAngle.Y = 270.000000000000000000
            Width = 1.000000000000000000
            Height = 1.000000000000000000
            Depth = 1.000000000000000000
            Quanternion = '(0,0.707106709480286,0,-0.707106828689575)'
            object Layer3D1: TLayer3D
              Height = 1.000000000000000000
              Resolution = 200
              RotationAngle.X = 270.000000000000000000
              StyleLookup = 'backgroundstyle'
              Transparency = True
              Width = 1.000000000000000000
              Quanternion = '(0.70710676908493,0,0,-0.70710676908493)'
              object Plane1: TPlane
                Position.X = 0.500000000000000000
                Position.Y = 0.740000009536743200
                Width = 1.000000000000000000
                Height = 0.200000002980232200
                Depth = 0.001000000047497451
                MaterialSource = LMS1
              end
              object Plane2: TPlane
                Position.X = 0.500000000000000000
                Position.Y = 0.550000011920929000
                Width = 1.000000000000000000
                Height = 0.200000002980232200
                Depth = 0.001000000047497451
                MaterialSource = LMS2
              end
              object Text3D1: TText3D
                Position.X = 0.500000000000000000
                Position.Y = 0.699999988079071000
                Position.Z = -0.100000001490116100
                Width = 0.600000023841857900
                Height = 0.079999998211860660
                Depth = 0.001000601798295975
                TwoSide = True
                Font.Size = 2.000000000000000000
                Font.StyleExt = {00070000000000000004000000}
                VertTextAlign = Leading
                Text = '2 0 2 3'
                WordWrap = False
                Flatness = 1.000000000000000000
                Sides = [Front]
                MaterialBackSource = LightMaterialSource1
                MaterialShaftSource = LMS1
                MaterialSource = LightMaterialSource1
              end
              object Text3D2: TText3D
                Position.X = 0.494978010654449500
                Position.Y = 0.507031559944152800
                Position.Z = -0.170234829187393200
                Width = 0.600000023841857900
                Height = 0.079999998211860660
                Depth = 0.001000601798295975
                TwoSide = True
                Font.Size = 2.000000000000000000
                Font.StyleExt = {00070000000000000004000000}
                VertTextAlign = Leading
                Text = '2 0 2 2'
                WordWrap = False
                Flatness = 1.000000000000000000
                Sides = [Front]
                MaterialBackSource = LightMaterialSource1
                MaterialShaftSource = LMS1
                MaterialSource = LightMaterialSource1
              end
              object Plane3: TPlane
                Position.X = 0.500000000000000000
                Position.Y = 0.259999990463256800
                Width = 1.000000000000000000
                Height = 0.400000005960464500
                Depth = 0.001000000047497451
                MaterialSource = LMS1
              end
            end
          end
        end
        object Light2: TLight
          Color = claWhite
          LightType = Directional
          SpotCutOff = 180.000000000000000000
          Position.X = -8.000000000000000000
          Position.Y = -4.000000000000000000
          RotationAngle.X = 45.000000000000000000
          Width = 1.000000000000000000
          Height = 1.000000000000000000
          Depth = 1.000000000000000000
          Quanternion = '(0.382683455944061,0,0,0.923879504203796)'
        end
      end
      object LightMaterialSource1: TLightMaterialSource
        Diffuse = xFFD58001
        Ambient = xFFFF0909
        Emissive = claNull
        Specular = xFFEB1111
        Shininess = 30
        Left = 104
        Top = 32
      end
      object LMS2: TLightMaterialSource
        Diffuse = xFF2F3840
        Ambient = claBlack
        Emissive = claNull
        Specular = xFF606060
        Shininess = 30
        Left = 104
        Top = 104
      end
      object LMS1: TLightMaterialSource
        Diffuse = xFF677D92
        Ambient = claBlack
        Emissive = claNull
        Specular = xFF606060
        Shininess = 30
        Left = 32
        Top = 208
      end

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    @ShaiLeTroll :

    Tu dois surement trouver le centre de ton texte par un FMX.Graphics.TCanvas.TextWidth et FMX.Graphics.TCanvas.TextHeight
    Lignes 6 et 7 : th := Canvas.TextHeight(S) / 2; tw := Canvas.TextWidth(S) / 2;

    faut connaitre aussi le coin Top Left, qui se calcule à partir du centre
    Ligne 14 : R := RectF(p2.X - tw, p2.Y - th, p2.X + tw, p2.Y + th);

    à toi de voir si il est plus simple de faire d'abord la Translation puis la Rotation ou alors l'inverse
    J'ai essayé différentes combinaisons en conservant les valeurs X et Y définies comme centre de rotation (X = 200 et Y = 150 dans mon exemple) et l'opération de rotation (exprimée par TMatrix.CreateRotation(DegToRad(-90))), je ne suis parvenu à aucun résultat satisfaisant.

    Je pensais que la formule magique était :

    Matrix := Matrix * TMatrix.CreateTranslation(-X, -Y);
    Matrix := Matrix * TMatrix.CreateRotation(DegToRad(Angle));
    Matrix := Matrix * TMatrix.CreateTranslation(X, Y);

    Sauf que dans le cas de mon exemple cela ne fonctionne pas !

    @AlWeber :

    Merci pour ton fichier dfm/fmx que j'ai bien chargé dans une fiche vierge pour examiner le fonctionnement de tes dummies. Ce que je cherche à dupliquer par code correspond manifestement à RotationAngle sur l'axe Z. Cela paraît tellement simple en 3D! Pour autant, comment arriver au même résultat en 2D sans utiliser d'objets visuels ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Bien que ce soit sur un sujet autre (les SVG ou plutôt FMX.Objects.TPath) j'ai tutoyé ces fameuses matrices, voir cette discussion en particulier les explications de Paul.


    À essayer, coordonnées centre : 50,100, sans garanties

    je n'ai aucun mérite, ce code se trouve dans un forum en anglais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
    const
      S = 'Hello World';
    var
      R: TRectF;
      SaveMatrix: TMatrix;
      Matrix: TMatrix;
    begin
      PaintBox1.Canvas.Fill.Color := TAlphaColors.Black;
      R := RectF(-Canvas.TextWidth(S), -Canvas.TextHeight(S), 0, 0);
      SaveMatrix := PaintBox1.Canvas.Matrix;
    // Rotation 90° par rapport au 0 = Horizontal donc -90
      Matrix := CreateRotationMatrix(DegToRad(-90));
    // coordonnées
      Matrix.m31 := 50;   
      Matrix.m32 := 100; 
      PaintBox1.Canvas.MultyMatrix(Matrix);
      PaintBox1.Canvas.FillText(R, S, False, 1, [], TTextAlign.taTrailing,
        TTextAlign.taTrailing);
      PaintBox1.Canvas.SetMatrix(SaveMatrix);
    end;
    Plus général
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure DrawRotatedText(Canvas: TCanvas; const P: TPointF; RadAngle: Single;
      const S: String; HTextAlign, VTextAlign: TTextAlign);
    var
      W: Single;
      H: Single;
      R: TRectF;
      SaveMatrix: TMatrix;
      Matrix: TMatrix;
    begin
      W := Canvas.TextWidth(S);
      H := Canvas.TextHeight(S);
      case HTextAlign of
        TTextAlign.taCenter:   R.Left := -W / 2;
        TTextAlign.taLeading:  R.Left := 0;
        TTextAlign.taTrailing: R.Left := -W;
      end;
      R.Width := W;
      case VTextAlign of
        TTextAlign.taCenter:   R.Top := -H / 2;
        TTextAlign.taLeading:  R.Top := 0;
        TTextAlign.taTrailing: R.Top := -H;
      end;
      R.Height := H;
      SaveMatrix := Canvas.Matrix;
      Matrix := CreateRotationMatrix(RadAngle);
      Matrix.m31 := P.X;
      Matrix.m32 := P.Y;
      Canvas.MultyMatrix(Matrix);
      Canvas.FillText(R, S, False, 1, [], HTextAlign, VTextAlign);
      Canvas.SetMatrix(SaveMatrix);
    end;
     
    procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
    begin
      PaintBox1.Canvas.Fill.Color := TAlphaColors.Black;
      DrawRotatedText(PaintBox1.Canvas, PointF(50, 100), DegToRad(-90),
        'Hello world', TTextAlign.taTrailing, TTextAlign.taTrailing);
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Péhelji Voir le message

    @AlWeber :

    Merci pour ton fichier dfm/fmx que j'ai bien chargé dans une fiche vierge pour examiner le fonctionnement de tes dummies. Ce que je cherche à dupliquer par code correspond manifestement à RotationAngle sur l'axe Z. Cela paraît tellement simple en 3D! Pour autant, comment arriver au même résultat en 2D sans utiliser d'objets visuels ?
    Tu peux faire une copie d'une partie de la fenêtre de l'application et en faire une image 2D. Je peux te passer les quelques lignes de code qui réalise cette opération

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    Alors, félicitations les amis, objectif atteint avec le second bout de code de Serge !
    Voici le résultat en prenant successivement (150, 100) et (250, 200) comme TPointF de rotation :

    Nom : TexteInverséA90Degrés.jpg
Affichages : 67
Taille : 11,9 Ko

    Le pire dans tout çà, c'est que, dans mes "recherches glanées sur Internet", j'avais récupéré ce bout de code sur le fameux forum en anglais. En le copiant/collant dans l'IDE, celui-ci l'avait immédiatement refusé, ne reconnaissant pas les procédures CreateRotationMatrix et MultyMatrix, qui étaient peut-être valables en 2014, mais plus sous Delphi 10.3.3 ! J'avais bien trouvé ce qui remplaçait la première procédure, mais pas la seconde.

    J'avais aussi consulté la discussion entre Serge et Paul sur les matrices, mais je m'étais senti un peu largué du fait de mes lacunes en mathématiques.

    Donc, pour servir de référence, en modifiant légèrement les deux procédures proposées pour les mettre à jour, voici comment afficher un texte selon un angle sous Firemonkey :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        procedure DrawRotatedText(Canvas: TCanvas; const P: TPointF; RadAngle: Single; const S: String; HTextAlign, VTextAlign: TTextAlign);
        var
          W: Single;
          H: Single;
          R: TRectF;
          SaveMatrix: TMatrix;
          Matrix: TMatrix;
        begin
          W := Canvas.TextWidth(S);
          H := Canvas.TextHeight(S);
          case HTextAlign of
            TTextAlign.taCenter:   R.Left := -W / 2;
            TTextAlign.taLeading:  R.Left := 0;
            TTextAlign.taTrailing: R.Left := -W;
          end;
          R.Width := W;
          case VTextAlign of
            TTextAlign.taCenter:   R.Top := -H / 2;
            TTextAlign.taLeading:  R.Top := 0;
            TTextAlign.taTrailing: R.Top := -H;
          end;
          R.Height := H;
          SaveMatrix := Canvas.Matrix;
     
          // Mise à jour des deux procédures
          Matrix := CreateRotation(RadAngle);
          Matrix.m31 := P.X;
          Matrix.m32 := P.Y;
          Canvas.MultiplyMatrix(Matrix);
     
          Canvas.FillText(R, S, False, 1, [], HTextAlign, VTextAlign);
          Canvas.SetMatrix(SaveMatrix);
        end;
     
        procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
        begin
          PaintBox1.Canvas.Fill.Color := TAlphaColors.Black;
          // Positionner TTextAlign sur Center
          DrawRotatedText(PaintBox1.Canvas, PointF(150, 100), DegToRad(-90), '2-0-2-0-à-2-0-2-2', TTextAlign.Center, TTextAlign.Center);
        end;
    Je vous remercie très sincèrement pour l'aide que vous m'avez apportée, et vous souhaite à tous un bon dimanche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher un texte selon heure d'appel entrant
    Par FB1111 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/06/2021, 00h37
  2. [WD-2000] Afficher un texte selon choix d'une liste déroulante
    Par wyzer dans le forum VBA Word
    Réponses: 11
    Dernier message: 13/12/2017, 10h12
  3. Afficher un texte selon le lien cliqué.
    Par ledisciple dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 30/04/2010, 16h38
  4. GradientPaint selon un angle donné
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 19/02/2008, 07h50
  5. Ecrire du texte selon un angle dans un TImage
    Par kem dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/10/2005, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo