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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 488
    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 488

  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