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] label avec une police qui s'ajuste


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut [MFC] label avec une police qui s'ajuste
    Bonjour,

    je souhaite créer un label (Cstatic) dont la taille de la police diminue si le texte ne tient pas dans le rectangle d'affichage.
    Donc j'ai dérivé un CStatic dont j'ai surchargé la fonction d'affichage OnPaint() comme ceci :

    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
     
    LOGFONT        lf;
     
     
     
    GetLogFont(lf); // Get Current font properties
     
     
    ::GetTextExtentPoint32(pDCMem->GetSafeHdc(), csText, csText.GetLength(), &sz);
     
    if ( sz.cx > pRect->Width() ){
    lf.lfHeight -= 1;  // diminue font size
    SetFont( &lf );
     
    }
    else{
    }
    pDCMem->DrawText(csText, pRect, dwFlags);
    Ce code fonctionne bien par contre j'aimerais reaugmenter la taille au fur et a mesure que le texte diminue.

    J'ai essayé de remplir le else comme ca :

    else{
    if (lf.lfHeight < nTailleInitial)
    lf.lfHeight += 1; // augmente font size
    SetFont( &lf );
    }

    mais j'obtiens une espece d'oscillation d'affichage.

  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,
    moi je ferais le test de taille de fonte sur le message de changement de texte
    hormis la premiere fois :
    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
     
    BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
    	//{{AFX_MSG_MAP(CMyStatic)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    ON_MESSAGE(WM_SETTEXT ,OnSetText)
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    LRESULT CMyStatic::OnSetText(UINT wParam, LONG lParam)
    {
    	LPCTSTR lpsz;
    	lpsz=(LPCTSTR)lParam; // chaine correspondant a SetWindowText
    // traitement de test sur la fonte ici et changement de fonte eventuel .
     
    	return Default();
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par farscape
    salut,
    moi je ferais le test de taille de fonte sur le message de changement de texte
    hormis la premiere fois :
    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
     
    BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
    	//{{AFX_MSG_MAP(CMyStatic)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    ON_MESSAGE(WM_SETTEXT ,OnSetText)
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    LRESULT CMyStatic::OnSetText(UINT wParam, LONG lParam)
    {
    	LPCTSTR lpsz;
    	lpsz=(LPCTSTR)lParam; // chaine correspondant a SetWindowText
    // traitement de test sur la fonte ici et changement de fonte eventuel .
     
    	return Default();
    }
    Ok mais dans ton OnSetText comment recuperes tu le DC courant

  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
    avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     CClientDC dc(this);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par farscape
    avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     CClientDC dc(this);
    Juste un detail auquel je pense OnSetText n'est appelé que lors d'un UpdateData et je n'utilise jamais cette fonction.

  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
    OnSetText est appelé sur un SetWindowtText .
    et updatedata finis par faire un SetWindowtText .

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par farscape
    OnSetText est appelé sur un SetWindowtText .
    et updatedata finis par faire un SetWindowtText .
    Le probleme est que je surcharge SetWindowText et que je n'appelle pas le SetWindowText par defaut pour reduire le "flickering". Je vais peut etre l'enlver et essayer tes suggestions.

  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
    salut,
    moi j'ai fais ç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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    LRESULT CMyStatic::OnSetText(UINT wParam, LONG lParam)
    {
    	LPCTSTR lpsz;
    	lpsz=(LPCTSTR)lParam;
     
    	CRect Rect;
    	LOGFONT    lf;
     
    	GetClientRect(&Rect);
    	if(!m_Font.m_hObject) // m_font c'est l'objet CFontEx de la faq
    	{
    		m_Font.GetFont(15,"Arial");
    		SetFont(&m_Font,FALSE);
    	}
     
    	CClientDC dc(this);
    	m_Font.GetLogFont(&lf); // Get Current font properties
     
    	do
    	{
    		SIZE sz;
    		::GetTextExtentPoint32(dc.GetSafeHdc(), lpsz, strlen(lpsz), &sz);
    		if( sz.cx > Rect.Width())
    		{
    			if(lf.lfHeight<0) lf.lfHeight ++;  // diminue font size		
    			else			  lf.lfHeight --;  // diminue font size		
     
    			m_Font.DeleteObject();
    			m_Font.CreateFontIndirect(&lf);
    			dc.SelectObject(&m_Font);
    			continue;
    		} 
    		break;
    	}
    	while(1);
    	SetFont( &m_Font,FALSE);
    	return Default();
    }
    a adpater

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

Discussions similaires

  1. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19
  2. [VBA-E]Erreur avec une combobox qui liste le contenu de cell
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/03/2006, 12h01
  3. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  4. PB avec une CComboBox qui vaut 0x00000000 !!
    Par chaser_T dans le forum MFC
    Réponses: 1
    Dernier message: 29/12/2005, 18h29
  5. Réponses: 4
    Dernier message: 04/03/2005, 11h56

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