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 :

Centrer un texte dans ListBox, dans OnDrawItem


Sujet :

C++Builder

  1. #1
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut Centrer un texte dans ListBox, dans OnDrawItem
    Bonjour a tous,
    Je chercher a centrer le texte d'un 'Item' dans une listbox lors de OnDrawItem (en fonction de cas précis).
    J'ai essayé :
    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
     
    void __fastcall TFVierge::NListBoxDrawItem(TWinControl *Control, int Index,
          const TRect &Rect, TOwnerDrawState State)
    {
          TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
          if ((Index%2)==0) pCanvas->Brush->Color = clSilver;
                           TField *pField;
                           switch (FVierge->ModeFiche[0])
                           {
                           case 'R':
                           pField = FVierge->NTable->Fields->Fields[3];
                           break;
                           case 'C':
                           pField = FVierge->NTable->Fields->Fields[4];
                           break;
                           }
          if (pField->AsString.operator ==(((TListBox *)Control)->Items->Strings[Index]))
                           {
                            pCanvas->Brush->Color = clCream;
                            pCanvas->FrameRect(Rect);
                            pCanvas->Font->Color = clRed;
                           }
                           else
                           {
          if(State.Contains(odSelected))
                           {
                            pCanvas->Brush->Color = clCream;
                            pCanvas->FillRect(Rect);
                            pCanvas->Font->Color = clMaroon;
                           }
          else
                           {
                            pCanvas->FillRect(Rect);
                           }
                           }
    //C'est la que commence mon sujet ...
          if (pField->AsString.operator ==(((TListBox *)Control)->Items->Strings[Index]))
                           {
                           int LTexte = ((TListBox *)Control)->Items->Strings[Index].Length();
                           int DTexte = (Rect.Width() - LTexte) * 0.50;
          pCanvas->TextOut(DTexte,Rect.Top+1, ((TListBox *)Control)->Items->Strings[Index]);
                           }
          else
                           {
          pCanvas->TextOut(Rect.Left+5,Rect.Top+1, ((TListBox *)Control)->Items->Strings[Index]);
                           }
    }
    Cela fonctionne a peu pres mais on ne peut pas dire que cela soit centré a 100 %, donc finalement pas térrible...
    Je pense que c'est parceque je 'compare' Strings[].Length() et Rect.Width(), enfin je crois (j'ai l'intuition que ce n'est pas tout a fait semblable ).
    Comment puis je faire pour centrer parfaitement le texte ?
    D'avance merci pour vos conseils (et bon dimanche...)
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    j'ai continué sur mon code et trouvé une solution qui fera l'affaire jusqu'a ce que je trouve comment réaliser réellement un 'alignment' digne de ce nom.
    L'idée c'est juste de tester si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Items->Strings[Index].Length();
    est inférieur ou supérieur a des valeurs repères que j'ai trouvé laborieusement (pas génial quoi), ce qui donne quelquechose comme:
    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
     
          if (pField->AsString.operator ==(((TListBox *)Control)->Items->Strings[Index]))
                           {
                           int LTexte = ((TListBox *)Control)->Items->Strings[Index].Length();
                           int DTexte;
                           if (LTexte < 10)
                           {
                           DTexte = (Rect.Width() - LTexte)/2.5;
                           }
                           else
                           {
                           DTexte = (Rect.Width() - LTexte)/3;
                           }
                           //etc, etc....
                          //
          pCanvas->TextOut(DTexte,Rect.Top+1, ((TListBox *)Control)->Items->Strings[Index]);
                           }
    Je ne doute pas un seul instant qu'il y a mieux, alors n'hésitez pas je suis preneur .
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Pour centrer un texte avec TextOut il faut au moins utiliser TextWidth et TextHeight qui renvoient la largeur
    et la hauteur du texte vis à vis du Canvas.
    Connaissant la hauteur et la largeur du clip (Rect)...
    Voir TCanvas dans l'aide !

    A plus !

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir Henderson et merci,
    J'etais resté bloqué sur TRect et ses propriétés et je suis passé complement a coté de la plaque !
    Ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          if (pField->AsString.operator ==(((TListBox *)Control)->Items->Strings[Index]))
                           {
                           int LTexte = pCanvas->TextWidth(((TListBox *)Control)->Items->Strings[Index]);
                           int DTexte = (Rect.Width() - LTexte)/2;
          pCanvas->TextOut(DTexte,Rect.Top+1, ((TListBox *)Control)->Items->Strings[Index]);
                           }
    et c'est beaucoup mieux, c'est sur.
    Merci
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

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

Discussions similaires

  1. Centrer un texte dans une page
    Par Samanta dans le forum Mise en forme
    Réponses: 5
    Dernier message: 20/09/2010, 22h30
  2. Centrer le texte dans une TStringGrid
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/06/2004, 11h01
  3. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  4. Centrer un texte dans un string Grid
    Par christine dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/10/2002, 22h33
  5. Copier le texte d'un ListBox dans le clipboard.
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/08/2002, 08h20

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