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

MFC Discussion :

[MFC]Ecrire du texte dans un rectangle


Sujet :

MFC

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [resolu][MFC]Ecrire du texte dans un rectangle
    Bonjour,
    Je veux écrire du texte dans un rectangle et je voudrais qu'il s'écrive au centre de mon rectangle, et qu'il soit de taille proportionnel à la taille du rectangle. J'utilisais la fonction DrawText, mais je ne sais pas si elle est adéquate pour ce que je veux. Pourriez vous me conseiller?
    Merci.

  2. #2
    mat.M
    Invité(e)
    Par défaut
    DrawText ou TextOut qu'importe, ce qu'il faut c'est obtenir :
    *le centre du rectangle avec CRect::Width()/2 et CRect::Height()/2
    *le centre du rectangle dans lequel est inscrit le texte.
    Pour cela il faut utiliser CDC::GetTextExtent pour une police donnée et qui retourne un objet CSize.

    Avec cela on peut déduire les coordonnées qui permettent de centrer le texte par soustraction..

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    C'est bon pour centrer le texte. Par contre je crois que j'ai trouvé une solution plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DrawText(text, -1, &myRect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    Par contre, je ne vois toujours pas comment je peux changer les dimension du texte.

  4. #4
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 60
    Points : 105
    Points
    105
    Par défaut
    Tu affectes une police, testes la taille de la chaine par rapport a celle du rectangle a l'aide de la fonction GetTextExtend. Si ca ne va pas, tu reduis (ou aggrandis) la police, et testes encore, tout ca dans une boucle jusqu'a ce que tu trouve la bonne taille de police. Une fois trouvee, il n'y a plus qu'a ecrire.

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    je suis désolée, mais je n'y arrive vraiment pas. La taille de la police c'est bien lfHeicht?
    Je vous donne le code que j'ai écrit et qui est faux, au cas où vous voyez ce qui ne va pas et ce que je ne comprends pas.
    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
    CFont newFont;
    	LOGFONT lf;
    	int h;
    	CSize taille;
     
    	h=(m_boxShape.bottom-m_boxShape.top)/2;
    // m_boxShape et mon rectangle dans lequel je veux mettre mon text
     
    	lf.lfHeight=8;
    	VERIFY(newFont.CreateFontIndirect(&lf));  // create the font
    	taille=pDC->GetTextExtent(Text);
     
    	while (taille.cy!=h)
    	{ 
    		if(taille.cy<h)
    		{lf.lfHeight++;}
    		else
    		{lf.lfHeight--;}
    		taille=pDC->GetTextExtent(Text);
    	}
     
    	CFont* def_font = pDC->SelectObject(&newFont);
     
    	pDC->SetTextColor(RGB(255, 0, 0));
    	pDC->SetBkMode(TRANSPARENT);
    	pDC->DrawText(Text,-1, m_boxShape, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
     
    	pDC->SelectObject(def_font);
     
    	// Done with the font. Delete the font object.
    	newFont.DeleteObject();

  6. #6
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 60
    Points : 105
    Points
    105
    Par défaut
    Premierement, creer une font ne suffit pas. Il faut l'assigner a ton dc, sinon celui-ci continue d'utiliser la font "courante":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    old_font = dc.SelectObject(&newfont);
    Je ne suis pas sur s'il faut reassigner la font a chaque iteration (a chaque fois que tu modifie la taille) ou non.

    Ensuite, ne cherches pas a avoir une taille qui correspond EXACTEMENT a celle de ton rectangle. Il est fort peu probable que ca fonctionne. Il y a de forte chance que la taille de ton rectangle se trouve entre deux tailles de polices. Cherches donc la plus grande qui rentre dans le rectangle, sinon tu arriveras probablement dans une boucle infinie qui va un coup reduire, un coup augmenter la taille de la font.

    Pour verifier que tout fonctionne, commence par bien verifier que ton GetTextExtend varie bien au fur et a mesure du changement de font.

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je n'y arrive toujours pas. Cette fois je pense que j'ai bien assigné ma police à mon dc(pDC est un pointeur CDC* que je déclare dans les arguments de la fonction où je me trouve, et quand je déclare cette fonction, j'écris bien CClientDC dc(this) avant). J'ai fait une boucle qui me parait cohérente, mais je n'ai toujours pas de texte.
    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
    	CFont newFont;
    	LOGFONT lf;
    	int h;
    	CSize taille;
    	h=(m_boxShape.bottom-m_boxShape.top)/2;
     
    	VERIFY(newFont.CreateFontIndirect(&lf));  // create the font
     
    	lf.lfHeight=8;
    	CFont* def_font = pDC->SelectObject(&newFont);
                    // j'assigne mon font à dc.
     
    	taille=pDC->GetTextExtent(Text);
    	// ici les valeurs retournées sont énormes.
    	while (taille.cy<h)
    	{ 
    		lf.lfHeight++;
    		taille=pDC->GetTextExtent(Text);
    		def_font = pDC->SelectObject(&newFont);
    	}
     
     
    	pDC->SetTextColor(RGB(255, 0, 0));
    	pDC->SetBkMode(TRANSPARENT);
    	pDC->DrawText(Text,-1, m_boxShape, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
     
    	pDC->SelectObject(def_font);
     
    	// Done with the font. Delete the font object.
    	newFont.DeleteObject();
    Si je met mon GetTextExtent avant de déclarer le def_font, les valeurs retournée sont cohérentes.
    Je ne sais plus quoi faire. Si vous pouvez m'aider...

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    c'est encore moi!
    Je ne suis toujours pas arrivé à résoudre mon problème. Désolée d'insister. Peut-être que si quelqu'un m'expliquait un peu ce que fais les diffèrentes fonctions dont j'ai besoin, je pourrais y arrivé. Pour augmenter la taille de la police, est-ce que c'est avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LOGFONT lf 
    lf.lfHeight=12;
    lf.lfWidth=12;
    ?
    Doit-on assigné des valeurs aux deux paramètres. Et est ce que ça ne dérange pas le fait d'égaliser des type CRect avec des types CSize?
    Mon code est au dessus.
    Merci pour votre aide

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé comment faire. Je donne mon code, pour les personnes qui seraient dans mon cas.

    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
    void CMyText::Dessin(CDC* pDC, CString Text)
    {
    	LOGFONT lf;
    	int h, l;
                    CRect MyRect;
    	h=(myRect.bottom-myRect.top)/2;//moitié de la hauteur du rectangle
    	l=(myRect.right-myRect.left)/2;// moitié de la largeur
    	if(l>h)
    	l=h;
       memset(&lf, 0, sizeof(lf));
       lf.lfHeight = -MulDiv(l, pDC->GetDeviceCaps(LOGPIXELSY), 72);
    // permet d'ajuster la taille de la police au rectangle
       lf.lfWeight = FW_NORMAL;
       lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
     
       // create and select it
       CFont newFont;
       if (!newFont.CreateFontIndirect(&lf))
          return;
       CFont* pOldFont = pDC->SelectObject(&newFont);
     
       pDC->SetBkMode(TRANSPARENT);
     
    	pDC->DrawText(Text,-1, m_boxShape, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
       pDC->SelectObject(pOldFont);
    }

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

Discussions similaires

  1. Ecrire du texte dans un rectangle drag&drop
    Par asco5 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 29/05/2013, 17h14
  2. [MFC] Changer le texte dans la barre de statut
    Par karl3i dans le forum MFC
    Réponses: 2
    Dernier message: 13/02/2004, 13h15
  3. comment ecrire du texte dans une window application
    Par gaut dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/07/2003, 10h23
  4. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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