Hauteur de static

mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023 - 28 janv. 2011 à 22:02
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 1 févr. 2011 à 12:19
Bonjour

j'ai un controle de type static contenant du texte
la largeur de ce controle est fixe
seule sa hauteur peut varier.
la police peut changer (même si elle reste identique pour tout le static)

avec GetTextExtentPoint32
j'arrive à calculer la hauteur necessaire (même quand le static "crée" les sauts de ligne pour tout afficher)

mon problème est quand le texte contient des sauts de ligne (mon code fonctionne si le texte ne contient pas de saut de ligne)


comment trouver la hauteur quand le texte du static contient des sauts de ligne ?


(en win32)
merci

7 réponses

mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
29 janv. 2011 à 04:47
j'ai trouvé une méthode :
il faut que je découpe mon texte en plusieurs char* (1 par ligne)
ensuite je fais la somme des hauteurs de chaque ligne avec GetTextExtentPoint32
je réaffiche ensuite mon texte et c'est bon

s'il y a mieux, je suis preneur
0
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
29 janv. 2011 à 05:58
"mon code fonctionne si le texte ne contient pas de saut de ligne"
en fait pas tout à fait

j'avais fait
GetTextExtentPoint32(hEditDc, Texte, nStrLen, &textSize);
Nblines = textSize.cx / largeur + 1;

en fait, ça fonctionne en fonction de la position des espaces à l'interieur du texte
GetTextExtentPoint32 semble retourner la hauteur si tout est affiché sur une seule ligne
dès que l'affichage du static génère des sauts de ligne, GetTextExtentPoint32 n'en tient pas compte

comment faire ?
merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 janv. 2011 à 17:46
Jette un oeil sur GetTextMetrics().

ciao...
BruNews, MVP VC++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 janv. 2011 à 23:02
Salut,
Tu peux utiliser DrawText() en lui passant DT_CALCRECT en dernier paramètre. Exemple:
RECT rect={0};
HDC hdc=GetDC(0);
DrawText(hdc,"Première ligne\r\nDeuxième ligne\r\nTroisième ligne",-1,&rect,DT_CALCRECT);
ReleaseDC(0,hdc);

Ne pas oublier d'uliser SelectObject() pour sélectionner la bonne police avant d'appeler DrawText(). Les dimensions se retrouveront dans le RECT.
0

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

Posez votre question
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
1 févr. 2011 à 09:00
Bonjour,

Si tu caonnais la longueur de ton texte sur une ligne et la longueur de ton static tu peux calculer le nombre de ligne . Non?


louis
0
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
1 févr. 2011 à 11:31
"Si tu connais la longueur de ton texte sur une ligne et la longueur de ton static tu peux calculer le nombre de ligne . Non? "

Ce que je croyais au début.

Il faudrait que je trouve un texte pour montrer un exemple parlant.
J'ai un texte qui contient plusieurs mots avec ou sans "\r\n".
si je tombe sur \r\n je sais qu'une ligne a été forcée, mon problème c'est le texte sans les sauts de ligne

Quand tu ne forces pas le saut de ligne
Windows crée des sauts de ligne pour afficher le texte dans le static

GetTextExtentPoint32 te donnes la longueur si le texte est sur 1 ligne
donc comme tu dis, le nombre de lignes devrait être égal à ((GetTextExtentPoint32 / largeur_du_static) + 1)
or ca ne fonctionne pas tout le temps : ca depend du nombre de mots et de la longueur des mots
et de la largeur des lettres utilisées (donc de la police)
donc dans certains cas nombre de lignes = ((GetTextExtentPoint32 / largeur_du_static) + 1)
et dans d'autres cas, c'est +


je vais voir pour GetTextMetrics et DrawText
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
1 févr. 2011 à 12:19
Si ton static ajoute les sauts de lignes automatiquement, tu devras mettre DT_WORDBREAK avec DT_CALCRECT. Le membre right du RECT doit contenir la largeur du static avant l'appel de DrawText(). Exemple:
RECT rect={0};
HDC hdc=GetDC(0);
rect.right=70;
DrawText(hdc,"Première ligne longue\r\nDeuxième ligne\r\nTroisième ligne",-1,&rect,DT_CALCRECT | DT_WORDBREAK);
ReleaseDC(0,hdc);

Je pense que DrawText() devrait résoudre ton problème.
0
Rejoignez-nous