[CPP] calcul de la longueur du texte en fonction de la largeur du label

Signaler
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010
-
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010
-
Salut,


J'ai un texte que je souhaite afficher dans un label. Si le texte est trop
grand, j'aimerais qu'il soit tronqué et qu'il se termine par "...".

Est-ce qu'un algorithme pour faire cette opération existe (en c++)?


Le type de police et la taille ne changeront pas. Pour facilité l'opération, je
me suis fait un tableau avec, pour chaque caractère ascii, la largeur en pixel.

 

Avez-vous des suggestions?

9 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je ne voit pas trop la difficulté !
Il existe des fonctions permettant de savoir la longeur d'un texte
En caractere : strlen()
En pixel DrawText() avec DT_CALCRECT

Apres je me servirais par exemple de strncpy() pour "couper ma chaine" et Strcat() pour rajouter des "..." mais je suis sur qu'il ya aussi des fonctions pouvant faire les deux a la fois.
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010

Ce n'est pas aussi simple que ça : strlen renvoie le nb de caratères. Mais tous les caractères n'ont pas la même largeur!
 
J'ai une appli (IHM) avec des labels. Dans ces labels, je doit mettre des textes qui sont dans une base de données. Il faut que je développe une lib qui calcule si le texte rentre dans la label. Pour ça, je dois parser le texte et calculer sa largeur en fonction de la largeur de chaque lettre. Je tronque si besoin à la fin d'un mot.
Le label peut être éventuellement multi-lignes, la police a une taille de 12 ou 16.

La lib doit être indépendante de l'appli IHM (que je ne développe pas). Par contre, j'ai les infos de largeur des labels et je sais pour chaque label si le texte est en 12 ou en 16, si il est multi ligne ou single ligne.

des idées?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Pour afficher du texte tronqué, on peut directement utiliser DrawText avec le flag DT_END_ELLIPSIS.

Si c'est dans un label (static), on peut mettre le label en ownerdraw et dessiner avec DrawText().
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010

Je ne cherche pas des fonction pour afficher ou dessiner, mais un algo intelligent pour tronquer un texte.
Je cherche un algo pour développer une librairie.. voir mon précédent post..
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

En pixel DrawText() avec DT_CALCRECT
Si tu connait exactement la police (sinon il te fut la recuperer) tu peux avoir exactement les dimensions de ton texte au pixel pres (ca te retourne un RECT) et ca marche aussi pour le multiligne.
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010

Merci pour votre aide. elle a l'air pas mal cette fonction.

 maheureusment le police est propriétaire. Je n'ai qu'un tableau dans lequel on m'a fourni la largeur des caractères pour chaque code ascii.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Lol, pourquoi faire simple quand on peut faire compliqué. Moi perso je passerais tout les caractere de mon texte ( Chaine[0] chaine[1] chaine [2] etc ... ) en additionnant la valeur en pixel de ton tableau et je m'arrete a longueur du label - "..."
un truc du style

int curlong=0;
int i = 0;
chaine = "texte de mon label";

While ((curlong < longeur du label - nbre de pixel de "...") || (i >= Strlen(chaine))
{
curlong+=valeur en pixel de chaine[i];
i+=1;
}
strncpy(label_a_afficher,chaine,i);
strncat(label_a_afficher,"...");
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

While ((curlong < longeur du label - nbre de pixel de "...") && (i < Strlen(chaine)) plutot sinon boucle sans fin
Messages postés
173
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
10 mai 2010

Oui, je suis parti sur une solution comme ça.