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 :

Modifier la taille d'un Edit en fonction du texte


Sujet :

MFC

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Modifier la taille d'un Edit en fonction du texte
    Bonjour,

    Je suis entrain de créer un petit éditeur graphique avec la saisie de texte à la volée.

    Mais je voudrais que la taille de mon édit change en fonction du contenu de l'edit.

    j'ai commencé à faire ça :
    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
     
     
    void CGEEditInline::OnChange() 
    {
    	DWORD dwMargins = GetMargins ( );
    	WORD wMarginLeft  = LOWORD ( dwMargins );
    	WORD wMarginRight = HIWORD ( dwMargins );
     
    	CRect rcClient; GetClientRect ( &rcClient );
     
     
    	CString sLine;      
    	int nLineLenght = LineLength ( 0 ); 
    	GetLine ( 0, sLine.GetBuffer ( nLineLenght ), nLineLenght );
     
     
    	int nMode = GetDC ( )->SetMapMode ( MM_TEXT );
    	CSize szSize = GetDC ( )->GetOutputTextExtent ( sLine );
    	GetDC ( )->SetMapMode ( nMode );
     
    	if ( wMarginLeft + szSize.cx + wMarginRight > rcClient.Width ( ) )
    	{
    		ASSERT ( FALSE );
    	}
    }
    Mais ce que je ne comprend pas dans le code que j'ai mis audessus c'est que le "GetOutputTextExtent" me retourne toujours une taille "cx=0 et cy=0".
    J'ai même tenté avec le "GetTextExtent" et c'est pareil.

    J'ai même vérifier que le font était correcte et effectivement elle est correct.

    Donc je ne sais plus quoi faire.
    Si quelqu'un à un idée pour résoudre mon problème de taille ou carrement de redimmensionnement de l'édit, je suis preneur.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    plusieurs erreurs dans ton code :
    un appel à GetDC doit etre relaché par ReleaseDC.
    ce qui n'est pas le cas dans ton code puisque tu appels plusieurs fois GetDC...
    ensuite je ne suis pas sur que la fonte soit selectionnée ,à verifier apres avoir corrigé l'utilisation de GetDC.
    corrige déjà tout ça apres on voit...

  3. #3
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Je viens de modifier mon code pour ajouter le ReleaseDC

    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
     
     
    void CGEEditInline::OnChange() 
    {
    	DWORD dwMargins = GetMargins ( );
    	WORD wMarginLeft  = LOWORD ( dwMargins );
    	WORD wMarginRight = HIWORD ( dwMargins );
     
    	CRect rcClient; GetClientRect ( &rcClient );
     
     
    	CString sLine;      
    	int nLineLenght = LineLength ( 0 ); 
    	GetLine ( 0, sLine.GetBuffer ( nLineLenght ), nLineLenght );
     
    	CDC * pDC = GetDC ( );
     
    	int nMode = pDC->SetMapMode ( MM_TEXT );
    	CSize szSize = pDC->GetOutputTextExtent ( sLine );
    	pDC->SetMapMode ( nMode );
     
    	if ( wMarginLeft + szSize.cx + wMarginRight > rcClient.Width ( ) )
    	{
    		ASSERT ( FALSE );
    	}
     
    	ReleaseDC ( pDC );
    }
    Mais cela ne change rien au problème. Dommage

    Sinon pour la font, j'ai bien vérifié et c'est bon voici ce que j'ai dans mon LOGFONT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	lfHeight		-8
    	lfWidth			0
    	lfEscapement		0
    	lfOrientation		0
    	lfWeight		400
    	lfItalic		0 ''
    	lfUnderline		0 ''
    	lfStrikeOut		0 ''
    	lfCharSet		0 ''
    	lfOutPrecision		0 ''
    	lfClipPrecision		0 ''
    	lfQuality		0 ''
    	lfPitchAndFamily	0 ''
    	lfFaceName		0x0012fa90 "MS Sans Serif"

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu es sur de ton GetLine et donc du contenu de sline ?
    pourquoi ne pas faire un simple GetWindowText ....
    le setmapmode est inutile a mon avis.


  5. #5
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Ok je note pour SetMapMode.
    Par contre, je veux calculer taille exactement de l'edit en fonction de toutes les lignes. Car l'edit peut être multiligne.

    Le code que j'ai donné correspond à la première version, version simplifié.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et donc szSize est vide ?
    dans ce cas fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CFont *poldFont=pDC->SelectObjet(GetFont());
    CSize szSize = pDC->GetTextExtent ( sLine );
    pDC->SelectObjet(poldFont);

  7. #7
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Je viens de trouver un truc assez bizarre.

    J'ai modifié un peu le code pour arriver à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	CString sLine;      
    	int nLineLenght = LineLength ( 0 ); 
    	GetLine ( 0, sLine.GetBuffer ( nLineLenght ), nLineLenght );
     
    	sLine = "TEST";
     
    	CDC * pDC = GetDC ( );
     
    	CSize szSize = pDC->GetOutputTextExtent ( sLine );
    Et maintenant, j'obtiens enfin la taille qu'il me fait.

    Par contre dans le debugger, c'est apparemment le même texte.

    Ce qui voudrait dire que le GetLine ( 0, sLine.GetBuffer ( nLineLenght ), nLineLenght ); marche bizarrement.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    le premier element de GetLine c'est l'index de la ligne et toi tu as toujours 0 .
    est ce normal ?

  9. #9
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Bon alors, j'ai enfin trouvé ça vient en premier lieu à sLine.GetBuffer.

    En fait quand, on fait un GetBuffer, on retourne un pointeur directement sur les données du CString. Cela veut dire qu'il n'y a plus de gestion de taille dans sLine.

    En plus le GetLine je met pas de '\0' à la fin de la chaine de caractère.

    J'ai modifié mon code avec ceci. C'est pas très propre et j'ai même peut être fait des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	int nLineLenght = LineLength ( 0 ); 
        char * psTmp = (char *)malloc ( nLineLenght + 1 );
    	GetLine ( 0, psTmp, nLineLenght );
    	psTmp [ nLineLenght ] = '\0';
    	CString sLine ( psTmp );
    	free (  psTmp );

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int nLineLenght = LineLength ( 0 ); 
    char * psTmp = new char[nLineLenght ];
    GetLine ( 0, psTmp, nLineLenght );
    CDC * pDC = GetDC ( );
    CSize szSize = pDC->GetOutputTextExtent ( psTmp,nLineLenght);
    delete []  psTmp;

  11. #11
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Effectivement c'est mieux. Moins barbare

  12. #12
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Merci beaucoup maintenant il ne me reste plus qu'a augmenté la taille de mon édit.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/03/2011, 09h12
  2. Réponses: 5
    Dernier message: 20/08/2009, 10h36
  3. Réponses: 5
    Dernier message: 24/04/2008, 09h53
  4. Modifier la taille d'un élément en fonction de la resolution
    Par kstou2001 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/12/2007, 23h38
  5. Réponses: 5
    Dernier message: 27/11/2002, 14h08

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