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

C++Builder Discussion :

Ecriture verticale sur divers composants [Langage/Algorithme]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    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 : 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
     
    #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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Pour ecrire sur un TLabel verticalement il faut mettre AutoSize a false
    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
     
    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);
    }
    }

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    J'ai reussi a ecrire verticalement dans un TEdit
    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
     
    //---------------------------------------------------------------------------
    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;
    }

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Avez vous teste le code
    Quand pensez vous
    Avez vous apporte des modifications

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ... 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 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    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

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

Discussions similaires

  1. Ecriture verticale sur un canvas
    Par blaiseac dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2005, 21h59
  2. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  3. aide sur les composants de la RxLib 2.75
    Par mariustrezor dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/10/2004, 14h35
  4. problème sur le composant aspSmartUpload
    Par PrinceMaster77 dans le forum ASP
    Réponses: 8
    Dernier message: 23/09/2004, 10h17
  5. [C#] OnPaint(PaintEventArgs e) sur création Composant
    Par pc152 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/08/2004, 16h13

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