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 :

r�cup�rer la hauteur de la fonte


Sujet :

MFC

  1. #1
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut r�cup�rer la hauteur de la fonte
    Bonjour,

    Dans un CDialog, j'ai un objet RichEdit.

    Je voudrai calculer la hauteur de 6 lignes de texte afin de pouvoir modifier la hauteur de ce controle pour qu'il contienne exactement ces 6 lignes.

    J'ai essay� GetTextExtend() qui ne semble pas g�rer les saut de lignes, il marche bien pour la largeur mais pas la hauteur.

    Je suis entrain de me battre avec le GetFont() mais la fonte que je r�cup�re n'est pas la bonne.

    Le but �tant que la hauteur du RichEdit s'adapte automatiquement au nombre de lignes de la string � afficher et aussi � la fonte choisie par Windows lors de la cr�ation de mon dialogue.

    Mon code :
    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
    void CMyRichEdit::SetText(const CString & String6Lignes)
    {
    CRect rect;
       GetWindowRect(rect);
       GetParent()->ScreenToClient(rect);
     
    CClientDC dc(this);
    CFont* font = dc.GetCurrentFont();
     
    LOGFONT lf;
       font->GetLogFont(&lf);
     
       int cy = lf.lfHeight;
       rect.bottom = rect.top + (6 * cy);
     
       MoveWindow(rect);
    }
    Merci de votre aide.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504

  3. #3
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    CDC:rawText ???
    Non non, je ne veux pas �crire le texte dans un rectangle donn�, je veux redimensionner le contr�le pour qu'il contienne exactement (pas plus ni moins) le texte � afficher.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  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
    Par d�faut
    salut, oui tu peux essayer Drawtext avec l'attribut : DT_CALCRECT ce qui te remplira un CRect pour l'occupation du texte.
    je souvent ce genre de choses:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CClientDC dc(this);
            CFont* pOldFont=NULL;
            if(pFont!=NULL)
                pOldFont=dc.SelectObject(pFont);
     
            CRect rectText;
            dc.DrawText(sText,rectText,DT_CALCRECT|DT_LEFT|DT_SINGLELINE);
     
            if(pOldFont!=NULL)
                dc.SelectObject(pOldFont);
                    nWidthText=rectText.Width();
            nHeightText=rectText.Height();

  5. #5
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Cela ne marche pas bien !!!

    Le code :
    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
    void CMyRichEdit::SetText(const CString & Text)
    {
    CRect rect;
    	GetWindowRect(rect);
    	GetParent()->ScreenToClient(rect);
     
    CClientDC dc(this);
     
    	CFont * pFont = GetFont();
    	CFont * pOldFont = NULL;
    	if(pFont != NULL)
    		pOldFont = dc.SelectObject(pFont);
     
    	CRect rectText;
    	dc.DrawText(Text, rectText, DT_CALCRECT);
     
    	if(pOldFont != NULL)
    		dc.SelectObject(pOldFont);
     
    	int nWidthText = rectText.Width();
    	int nHeightText = rectText.Height();
     
    	rect.bottom = rect.top + nHeightText;
    	rect.right = rect.left + nWidthText;
     
    	MoveWindow(rect);
     
    	SetWindowText(Text);
    }
    Si dans l'�diteur de ressources du dialogue, je choisis une fonte un peu plus grosse (taille 10 au lieu de 8 par d�faut), la taille calcul�e n'est pas bonne.

    J'ai l'impression que "CClientDC dc(this)" ne sait pas encore quelle fonte va �tre utilis�e et donc il en choisis une par d�faut qui n'est pas la bonne.

    Il faudrait lui sp�cifier la fonte � utiliser avec SetFont() mais je ne sais pas comment r�cup�rer la fonte qui va �tre utilis�e.

    Pour info, "CFont * pFont = GetFont();" retourne NULL.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  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
    Par d�faut
    hum dans le cadre d'un richedit �a doit un peu plus compliqu�, je ne pense pas que Getfont soi la fonte en cours ..

  7. #7
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    En fait, le probl�me est un tout petit peu plus complexe.

    D�j�, d'apr�s ce que j'ai compris, les contr�les d'une boite de dialogue n'ont pas de fonte de caract�res. Seul le dialogue qui porte les contr�les a une fonte. Les contr�les doivent faire un GetParent()->GetFont() pour r�cup�rer la fonte.

    D'ailleurs, les contr�les d'un dialogue ne recoivent pas le message WM_SETFONT (alors que le dialogue le re�oit).

    Ensuite mes autres erreurs �taient qu'il fallait tenir compte de la diff�rence de taille entre GetWindowRect() et GetClientRect(). La diff�rence sert � dessiner la bordure du contr�le (NC area ?)

    Ci dessous, une petite classe qui fait tous les calculs et qui redimensionne automatiquement un CRichEdit ou un CEdit pour que le texte tienne exactement dans la fen�tre (attention, le flag ES_MULTILINE doit �tre mis explicitement dans l'�diteur de ressources si on fait du multi ligne).

    Fichier ComputeSize.h
    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
    #pragma once
     
    class CComputeSize
    {
    public:
    	CComputeSize(void);
    	~CComputeSize(void);
     
    	void SetText(CWnd * pWnd, const CString & Text);
     
    private:
    	int NbPixelPerLine(CWnd *pWnd);
    	int NbLine(const CString & Str);
     
    };
    Fichier ComputeSize.cpp
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include "StdAfx.h"
    #include "ComputeSize.h"
     
    CComputeSize::CComputeSize(void)
    {
    }
     
    CComputeSize::~CComputeSize(void)
    {
    }
     
    int CComputeSize::NbPixelPerLine(CWnd *pWnd)
    {
    	CClientDC dc(pWnd);
     
    	CFont * pOldFont = dc.SelectObject(pWnd->GetParent()->GetFont());
     	TEXTMETRIC tm;
    	dc.GetTextMetrics(&tm);
     
    	if(pOldFont != NULL)
    		dc.SelectObject(pOldFont);
     
    	int nHeightText = tm.tmAscent + tm.tmDescent + tm.tmExternalLeading;
    	TRACE(L"NbPixelPerLine = %d\n", nHeightText);
    	return nHeightText;
    }
     
    int CComputeSize::NbLine(const CString & Str)
    {
    	// comptage du nombre de retour chariot
    	// il y a toujours au moins une ligne
    	int nb_line = 1;
    	int pos = Str.Find('\n');
    	while(pos != -1)
    	{
    		nb_line++;
    		pos = Str.Find('\n', pos + 1);
    	}
     
    	TRACE(L"NbLine = %d\n", nb_line);
    	return nb_line;
    }
     
    void CComputeSize::SetText(CWnd * pWnd, const CString & Text)
    {
    	CRect rect;
    	pWnd->GetWindowRect(rect);
    	//TRACE(L"Window Rect Size is %dX%d\n", rect.Width(), rect.Height());
    	pWnd->GetParent()->ScreenToClient(rect);
    	TRACE(L"Window Rect Size is %dX%d\n", rect.Width(), rect.Height());
     
    	CRect client;
    	pWnd->GetClientRect(client);
    	TRACE(L"Client Rect Size is %dX%d\n", client.Width(), client.Height());
     
    	// calcul la différence de hauteur entre client area et window area (utilisé pour dessiner la bordure)
    	// on ajoute 2 parce qu'il semble que cela soit necessaire
    	int extra = rect.Height() - client.Height() + 2;
     
    	// calcule la hauteur nécessaire pour le texte
    	int nHeightText = NbPixelPerLine(pWnd);
    	int nb_line = NbLine(Text);
    	nHeightText *= nb_line;
     
    	// modifie la taille de la fenetre
    	rect.bottom = rect.top + nHeightText + extra;
    	pWnd->MoveWindow(rect);
    	pWnd->SetWindowText(Text);
    }
    Ensuite pour l'utiliser, il faut cr�er une classe CMyRichEdit (ou CMyEdit) d�rivant de CRichEditCtrl (ou CEdit)

    Fichier MyRichEdit.h
    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
    #pragma once
    #include "ComputeSize.h"
     
    class CMyRichEdit : public CRichEditCtrl
    {
    public:
    	CMyRichEdit(void);
    	virtual ~CMyRichEdit(void);
     
    	void SetText(const CString & Text);
     
    protected:
    	DECLARE_MESSAGE_MAP()
     
    private:
    	CComputeSize m_autosize;
     
    };
    Fichier MyRichEdit.cpp
    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
    #include "stdafx.h"
    #include "MyRichEdit.h"
    
    BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
    END_MESSAGE_MAP()
    
    CMyRichEdit::CMyRichEdit(void)
    {
    }
    
    CMyRichEdit::~CMyRichEdit(void)
    {
    }
    
    void CMyRichEdit::SetText(const CString & Text)
    {
    	m_autosize.SetText(this, Text);
    }
    et enfin modifier la classe du dialogue
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class CMainDlg : public CDialog
    {
    ...
    private:
    	CMyRichEdit m_rich;
    };
    et ensuite, on peut modifier le texte des contr�les (dans OnInitDialog() par exemple)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    BOOL CMainDlg::OnInitDialog()
    {
    	...
    	CString str;
    	str = L"Ligne 1\r\nLigne 2\r\nLigne 3\r\nLigne 4\r\nLigne 5\r\nLigne 6";
    	m_rich.SetText(str);
    	return TRUE;
    }
    Les remarques et les am�liorations sont les bienvenues
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. r�cup�rer la hauteur de la zone d'affichage
    Par superpigeon dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 29/11/2007, 16h45
  2. R�ponses: 7
    Dernier message: 08/10/2007, 17h23
  3. [RegEx] Comment r�cup�rer du texte entre balises <font> ?
    Par leboy dans le forum Langage
    R�ponses: 3
    Dernier message: 11/04/2007, 18h03
  4. R�ponses: 11
    Dernier message: 25/02/2007, 01h56
  5. R�ponses: 2
    Dernier message: 24/01/2007, 19h55

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