+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut Ecriture verticale sur divers composants

    Bonjours a tous
    Il y a quelques temps j'avais poste sur le sujet, mes recherches non pas apportees de reponses satisfaisantes, pour mes besoins j'ai repris mes recherches cette fois ci avec un oeuil neuf, je peux ecrire sur le Canvas de plusieurs composants verticalement
    le .cpp
    Code :
    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
     
    #include "Unit1.h"
    #include "StrUtils.hpp"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage vertical";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
            // Largeur de la Fonte
            int X = Canvas->TextWidth("W");
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            String c = MidStr(Dstr, i, 1);
            Canvas->TextOut(X, Y * i, c);
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage vertical";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    //pcn->Control = Panel1;
    //pcn->Control = Bevel1;
    //pcn->Control = Shape1;
    pcn->Control = Button2;
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
    {
    String c = MidStr(Dstr, i, 1);
    pcn->TextOutA(X, Y * i, c);
    }
    }
    //---------------------------------------------------------------------------
    Le code fonctionne pour une TForm, un TPanel, un TBevel, un TShape, un TButton
    Etrangement je n'ai pas reussi pour un TLabel, mais je continue a chercher
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    Pour ecrire sur un TLabel verticalement il faut mettre AutoSize a false
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage vertical";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    //pcn->Control = Panel1;
    //pcn->Control = Bevel1;
    //pcn->Control = Shape1;
    //pcn->Control = Button2;
    Label1->AutoSize = false;
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
    {
    String c = MidStr(Dstr, i, 1);
    Label1->Canvas->TextOutA(X, Y * i, c);
    }
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    J'ai reussi a ecrire verticalement dans un TEdit
    Code :
    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
     
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage vertical";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    //pcn->Control = Panel1;
    //pcn->Control = Bevel1;
    //pcn->Control = Shape1;
    //pcn->Control = Button2;
    pcn->Control = Edit1;
    //Label1->AutoSize = false;
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
    {
    String c = MidStr(Dstr, i, 1);
    pcn->TextOutA(X , Y * i, c);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    Edit1->Height = 517;
    //Edit1->Width = 43;
    //Edit1->Visible = true;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    Avez vous teste le code
    Quand pensez vous
    Avez vous apporte des modifications
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  5. #5
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 086
    Points : 14 327
    Points
    14 327

    Par défaut

    Peux comparer avec ce code C++ que j'ai posté dans la section Delphi : Delphi7 texte Vertical qui doit fonctionner avec n'importe quel TWinControl comme Control, c'était un code spécifique pour dessiner des onglets mais c'est facilement adaptable comme ci-dessus pour une TPaintBox

    Code :
    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
    void __fastcall TVCLManipForm::PaintBoxFontOrientationAndEscapementPaint(TObject *Sender)
    {
      if (Sender->InheritsFrom(__classid(TPaintBox)))
      {
        TPaintBox *PntBx = (TPaintBox*)Sender;
     
        TRect Rect = PntBx->BoundsRect;
        PntBx->Canvas->FillRect(Rect);
     
        LOGFONT ParamFont;
        if (GetObject(PntBx->Canvas->Font->Handle, sizeof(ParamFont), &ParamFont) > 0)
        {
          int OldMode;
          if (CheckBoxFontOrientationAndEscapement->Checked)
            OldMode = SetGraphicsMode(PntBx->Canvas->Handle, GM_ADVANCED);
          else
            OldMode = GetGraphicsMode(PntBx->Canvas->Handle);
     
          try
          {
            TSmallPoint ClicCpt;
            ClicCpt = (TSmallPoint&)PntBx->Tag;
     
            if (GetGraphicsMode(PntBx->Canvas->Handle) == GM_ADVANCED)
            {
              ParamFont.lfEscapement = ClicCpt.y; // tenths of degrees, angle of Text
              ParamFont.lfOrientation = ClicCpt.x; // tenths of degrees, angle of Letters
            }
            else
              ParamFont.lfEscapement = ClicCpt.y; // tenths of degrees, angle of Text and Letters
     
            AnsiString OrientationAndEscapement;
            OrientationAndEscapement.sprintf("Escapement = %d, Orientation = %d", ClicCpt.y, ClicCpt.x);
            DrawText(PntBx->Canvas->Handle, OrientationAndEscapement.c_str(), -1, (LPRECT)&Rect, 0);
     
            HGDIOBJ NewFontHandle = CreateFontIndirect(&ParamFont);
            try
            {
              HGDIOBJ OldFontHandle = SelectObject(PntBx->Canvas->Handle, NewFontHandle);
              try
              {
                int VerticalAlign = CheckBoxFontOrientationAndEscapementCenterOrTopAlign->Checked ? DT_VCENTER : DT_TOP;
                DrawText(PntBx->Canvas->Handle, PanelFontOrientationAndEscapement->Caption.c_str(), -1, (LPRECT)&Rect, DT_NOCLIP | DT_SINGLELINE | VerticalAlign | DT_CENTER);
     
              }
              __finally
              {
                SelectObject(PntBx->Canvas->Handle, OldFontHandle);
              }
            }
            __finally
            {
              DeleteObject(NewFontHandle);
            }
          }
          __finally
          {
            SetGraphicsMode(PntBx->Canvas->Handle, OldMode);
          }
        }
      }
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::PaintBoxFontOrientationAndEscapementMouseMove(
          TObject *Sender, TShiftState Shift, int X, int Y)
    {
      if (Sender->InheritsFrom(__classid(TPaintBox)))
      {
        TPaintBox *PntBx = (TPaintBox*)Sender;
     
        TSmallPoint ClicCpt;
        ClicCpt = (TSmallPoint&)PntBx->Tag;
     
        if (Shift.Contains(ssCtrl))
        {
          if (Shift.Contains(ssLeft))
            ClicCpt.x--;
          else
            ClicCpt.x++;
     
          if (ClicCpt.x < -3600)
            ClicCpt.x = 0;
          if (ClicCpt.x > 3600)
            ClicCpt.x = 0;
        }
        if (Shift.Contains(ssShift))
        {
          if (Shift.Contains(ssLeft))
            ClicCpt.y--;
          else
            ClicCpt.y++;
     
          if (ClicCpt.y < -3600)
            ClicCpt.y = 0;
          if (ClicCpt.y > 3600)
            ClicCpt.y = 0;
        }
     
        PntBx->Tag = (int&)ClicCpt;
     
        PntBx->Invalidate();
      }
    }
    Il y a deux types d'écritures verticales :

    - soit les lettres ont leur propre angle et le texte un autre angle, pour ton cas de lettres écrites les une en dessous des autres, ça doit être un angle une lfOrientation de 0 et lfEscapement -900), ton code doit être similaire de
    écrire verticalement dans une cellule stringgrid où j'avais honteusement triché pour écrire les libellés trop long sur deux colonnes !

    - soit les lettres suivent l'angle du texte (si pas GM_ADVANCED), comme juste lfEscapement est pris en compte, lfOrientation reste à zéro mais c'est comme si sa valeur était égale à celle de lfEscapement


    En mode GM_ADVANCED, il ne faut pas utiliser DT_VCENTER, il calcule n'importe quoi, c'est bien pour la démo, DT_TOP serait parfait !

    Donc pour un lfOrientation de 0 et lfEscapement à -900)
    il faut jouer sur l'alignement, je te conseille
    Code :
    ... DT_NOCLIP | DT_SINGLELINE | DT_TOP | DT_CENTER);
    tu peux remplacer DT_CENTER par DT_RIGHT !
    Essaye d'autre valeur, tu verras que cela déborde du Rectangle !


    Sinon MidStr, c'est un peu lourd sachant que la String fourni un opérateur [] pour accéder à un caractère !
    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

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    Salut ShaiLeTroll
    Merci pour tes reponses, il y a beaucoup de code a digerer et a adapter.
    Il y a une solution qui se trouve dans Trucs et Astuces pour C++ Builder de CGI, mais c'est comme si on ecrivait sur une planche et qu'on tourne cette planche, l'ecriture n'est pas vraiement comme je le voulais, de plus la polices doit etre True Type.
    J'avais fait l'essai avec un StringGrid pour gerer le redimensionnement sur plusieurs colonnes.
    La methode decrite n'utilise rien d'autre que le composant sur lequel on ecrit, c'est sur ca ne gere pas l'ecriture sur plusieurs colonne.
    Peut tu m'en dire plus sur
    sachant que la String fourni un opérateur [] pour accéder à un caractère !
    surement quelque chose auquel je n'ai pas pense
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  7. #7
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 086
    Points : 14 327
    Points
    14 327

    Par défaut

    Citation Envoyé par blondelle Voir le message
    Merci pour tes reponses, il y a beaucoup de code a digerer et a adapter.
    Ne retient que ceci :
    Code :
    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
     
          OldMode = SetGraphicsMode(Control->Canvas->Handle, GM_ADVANCED);
          try
          {
            if (GetGraphicsMode(Control->Canvas->Handle) == GM_ADVANCED)
            {
              ParamFont.lfEscapement = -900; // tenths of degrees, angle of Text
              ParamFont.lfOrientation = 0; // tenths of degrees, angle of Letters
            }
            else
              ParamFont.lfEscapement = -900; // tenths of degrees, angle of Text and Letters
     
            HGDIOBJ NewFontHandle = CreateFontIndirect(&ParamFont);
            try
            {
              HGDIOBJ OldFontHandle = SelectObject(Control->Canvas->Handle, NewFontHandle);
              try
              {
                DrawText(Control->Canvas->Handle, Control->Text.c_str(), -1, (LPRECT)&Rect, DT_NOCLIP | DT_SINGLELINE | DT_TOP | DT_CENTER);
              }
              __finally
              {
                SelectObject(Control->Canvas->Handle, OldFontHandle);
              }
            }
            __finally
            {
              DeleteObject(NewFontHandle);
            }
          }
          __finally
          {
            SetGraphicsMode(Control->Canvas->Handle, OldMode);
          }
    Si tu le mets dans une fonction réutilisable avec un TWinControl comme paramètre, il n'y a rien de compliqué !

    Citation Envoyé par blondelle Voir le message
    Il y a une solution qui se trouve dans Trucs et Astuces pour C++ Builder de CGI, mais c'est comme si on ecrivait sur une planche et qu'on tourne cette planche, l'ecriture n'est pas vraiement comme je le voulais, de plus la polices doit etre True Type.
    Cela doit être le même code, cela ressemble énormément sauf qu'en GM_ADVANCED le texte peut être dans un sens et les lettres dans un autre et donc obtenir les lettres écrites les une en dessous des autres comme si l'on avait écrire une lettre ligne dans une TListBox, les lettres ne sont pas penché !
    Pour que GM_ADVANCED soit disponible fort probable que le True Type soit requis !


    Citation Envoyé par blondelle Voir le message
    Peut tu m'en dire plus sur
    Citation Envoyé par ShaiLeTroll Voir le message
    sachant que la String fourni un opérateur [] pour accéder à un caractère !
    surement quelque chose auquel je n'ai pas pense

    Sinon pour opérateur [], je suppose que tu ironises

    Code :
    1
    2
    3
    4
    5
      // La chaine a afficher verticalement
      String Dstr = "C++ Builder affichage vertical";
      int lng = Dstr.Length();
      for (int i = 1; i <= lng; i++)
        pcn->TextOut(X , Y * i, Dstr[i]); // tout simplement !
    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

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    pcn->TextOut(X , Y * i, Dstr[i]); // tout simplement !
    Et bien je n'y avais pas pense ( " pourquoi faire simple quand on peut faire complique " )
    Pour ton code je vais tester dans la semaine.
    Je pense que je vais rester sur le code que j'ai ecrit, il est court il reste juste a calculer les hauteur des boites de dialogue
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    Voici le code pour ecrire verticalement sur plusieurs composant, l'ecriture multiligne n'est pas geree, ce n'est qu'une base de depart
    le .cpp
    Code :
    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
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
            // Largeur de la Fonte
            int X = Canvas->TextWidth("W");
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            Form1->Canvas->TextOut(X, Y * i, Dstr[i]); // tout simplement !
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    Label1->AutoSize = false;
    Label1->Height = (lng + 1) * Y;
    Label1->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            Label1->Canvas->TextOutA(X , (Y - 1)* i, Dstr[i]);
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = Edit1;
    Edit1->Height = lng * Y;
    Edit1->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            pcn->TextOutA(X , (Y - 1) * i, Dstr[i]);
            }
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = Panel1;
    pcn->Brush->Color = clBtnFace;
    Panel1->Height = (lng + 1)* Y;
    Panel1->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            pcn->TextOutA(X , (Y - 1) * i, Dstr[i]);
            }
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = Bevel1;
    pcn->Brush->Color = clBtnFace;
    Bevel1->Height = (lng + 1) * Y;
    Bevel1->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            pcn->TextOutA(X , (Y - 1) * i, Dstr[i]);
            }
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = Shape1;
    Shape1->Height = (lng + 1) * Y;
    Shape1->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            pcn->TextOutA(X , (Y - 1) * i, Dstr[i]);
            }
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button8Click(TObject *Sender)
    {
    // La chaine a afficher verticalement
    String Dstr = "C++ Builder affichage verticale";
            // Nombre de caracteres de la chaine
            int lng = Dstr.Length();
                    // Hauteur de la Fonte
                    int Y = Canvas->TextHeight("W");
    // Largeur de la Fonte
    int X = Canvas->TextWidth("W");
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = Button2;
    pcn->Brush->Color = clBtnFace;
    Button2->Height = (lng + 1) * Y;
    Button2->Repaint();
    // affichage vertical de la chaine
    for(int i = 1; i <= lng; i++)
            {
            pcn->TextOutA(X , (Y - 1) * i, Dstr[i]);
            }
    delete pcn;
    }
    //---------------------------------------------------------------------------
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    juin 2002
    Messages
    1 360
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : juin 2002
    Messages : 1 360
    Points : 1 736
    Points
    1 736

    Par défaut

    Salut !

    Pour un label (qui affiche en MULTILINE), l'astuce passe aussi par modifier le texte en insérant des \n.
    Donc une fois fait, ce n'est plus à gérer (tant que le texte n'est pas modifié):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    char N[128];
    char Z[256];
    //--------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    int i=0;
    strcpy(N, Label1->Caption.c_str());
    int le = strlen(N);
    while(i < le)
        {
        Z[i*2] = N[i];
        Z[(i*2) + 1] = '\n';
        i++;
        }
    Z[i*2]=0;
    Label1->Caption = Z;
    } 
    //--------------
    Donc à adapter (en dérivant de TLabel... peut-être)!

    A plus !

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    mars 2006
    Messages
    2 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 2 735
    Points : 3 665
    Points
    3 665

    Par défaut

    Salut henderson
    Merci pour ta reponse.
    C'est une autre facon de proceder qui est aussi interessante
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir.
    • N'oubliez pas de consulter la FAQ, la recherche sur le Forum.
    • N'oubliez pas que l'aide BCB existe, elle s'affiche sous simple pression de la touche F1.
    • N'oubliez pas de mettre : Bouton en bas de la page ou menu Outils de la discussion -> Mettre Résolu.
    • Mes Tutos http://jp-blondelle.developpez.com/

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •