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

titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010 - 20 oct. 2006 à 15:31
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010 - 20 oct. 2006 à 18:47
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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 oct. 2006 à 16:35
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.
0
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010
20 oct. 2006 à 16:56
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?
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
20 oct. 2006 à 16:59
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().
0
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010
20 oct. 2006 à 17:08
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..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 oct. 2006 à 17:46
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.
0
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010
20 oct. 2006 à 18:17
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 oct. 2006 à 18:39
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,"...");
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 oct. 2006 à 18:41
While ((curlong < longeur du label - nbre de pixel de "...") && (i < Strlen(chaine)) plutot sinon boucle sans fin
0
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010
20 oct. 2006 à 18:47
Oui, je suis parti sur une solution comme ça.
0
Rejoignez-nous