Savoir la taille en pixel que prendra un texte dans une police x

Savoir la taille en pixel que prendra un texte dans une police x - Divers - Programmation

Marsh Posté le 01-10-2003 à 23:20:35    

Je me demandais s'il y avait un algo, pour savoir, avant de le dessiner, la place que prendrait un texte.  
 
Par exemple
 
"Je mange des cerises" en Verdana, 14 ---> 28 px
 
La solution serait de prendre un fonte à largeur fixe, mais bon. c'est pas terrible terrible...
 
Si qqn sait me dire la largeur de chaque lettre, je peux me débrouiller.
 
J'ai développé une librairie pour générer des graphiques SVG en C#, et le wordwrapping n'existe pas en version 1.1 (il est prévu pour la version de SVG 1.2)
 
Une démo de ma librairie : http://dev.icare.ch/svgdemo/ (plugin SVG à télécharger)
 
En fait j'aimerais adapter mon texte sur plusieurs lignes dans un carré (max 3 lignes) et si le texte est trop long, le diminuer
 
Si quelqu'un a une piste... Merci d'avance

Reply

Marsh Posté le 01-10-2003 à 23:20:35   

Reply

Marsh Posté le 01-10-2003 à 23:53:16    

la fonction GetTextExtentPoint32() de l'api win32 fait ca a merveille.
 
Si t'as pas le droit d'utiliser du win32, alors je sais pas.

Reply

Marsh Posté le 02-10-2003 à 00:00:17    

Je vais tester ça demain... merci !

Reply

Marsh Posté le 02-10-2003 à 09:10:24    

C'est pas tout à fait ça, car je ne peux pas préciser la fonte et la taille de celle-ci...


Message édité par jagstang le 02-10-2003 à 09:10:40

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 02-10-2003 à 09:44:46    

JagStang a écrit :

C'est pas tout à fait ça, car je ne peux pas préciser la fonte et la taille de celle-ci...


Si, en définissant ta fonte dans le DC que tu passes à ta fonction. Voici un petit bout de code qui me permettait d'avoir la taille d'un texte dans une barre d'état (en C/C++/MFC):

Code :
  1. NONCLIENTMETRICS infoNCMetrics;
  2. infoNCMetrics.cbSize = sizeof( NONCLIENTMETRICS );
  3. SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof( NONCLIENTMETRICS ), &infoNCMetrics, 0 );
  4. CFont fntStatus;
  5. fntStatus.CreateFontIndirect( &infoNCMetrics.lfStatusFont );
  6. CDC *pDC = this->m_wndStatusBar.GetDC();
  7. CFont *oldFont = pDC->SelectObject( &fntStatus );
  8. CSize szText = pDC->GetOutputTextExtent( this->m_wndStatusBar.GetPaneText(pCmdUI->m_nIndex) );
  9. pDC->LPtoDP( &szText );
  10. pDC->SelectObject( oldFont )->DeleteObject();


 
Ici, j'utilise la fonction GetOutputTextExtent et je récupère la fonte utilisée avec SystemParametersInfo.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 02-10-2003 à 10:58:38    

JagStang a écrit :

"Je mange des cerises" en Verdana, 14 ---> 28 px

Ça dépend de ta façon de créer la fonte, avec internal leading ou sans : regarde le signe de nHeight dans http://msdn.microsoft.com/library/ [...] t_8fp0.asp
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed