Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > C++Builder
C++Builder Environnement de développement RAD C++Builder. Avant de poster -> F.A.Q C++Builder, Sources C++Builder
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 29/04/2012, 14h41   #1
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2012, 14h55   #2
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2012, 15h30   #3
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2012, 18h35   #4
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 10h34   #5
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 172
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 172
Points : 13 204
Points : 13 204
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 14h49   #6
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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
Citation:
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 17h14   #7
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 172
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 172
Points : 13 204
Points : 13 204
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 19h07   #8
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
Citation:
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2012, 16h12   #9
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2013, 10h51   #10
henderson
Membre Expert
 
Inscription : juin 2002
Messages : 1 342
Détails du profil
Informations personnelles :
Localisation : Pays-Bas

Informations forums :
Inscription : juin 2002
Messages : 1 342
Points : 1 656
Points : 1 656
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 !
henderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2013, 13h42   #11
blondelle
Rédacteur
 
Avatar de blondelle
 
Homme
Inscription : mars 2006
Messages : 2 619
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 2 619
Points : 3 393
Points : 3 393
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/
blondelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h29.


 
 
 
 
Partenaires

Hébergement Web