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 :

Comment récupérer une fonte systeme et la modifier?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut Comment récupérer une fonte systeme et la modifier?
    Salut,

    Tout est dans le titre.

    Je voudrais récupérer les caractéristiques d'une fonte système, dans le but de la mettre en gras et de la réappliquer à un contrôle.

    Voici le code que j'ai tenté, mais ça me sort un Assertion Failure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LOGFONT boldFont;
    CFont tmpFont;
    HFONT hDlgFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    tmpFont.FromHandle(hDlgFont);
    tmpFont.GetLogFont(&boldFont);
    En fait, le code bugge ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmpFont.GetLogFont(&boldFont);
    Est ce normal?

    Merci

  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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Bah j'étais alleé voir la FAC, mais il ne me semble pas que ça réponde à ma question, et encore moins que ça m'explique pourquoi mon code ne marche pas.

    Par contre, c'est vrai que je pourrais utiliser une autre méthode: rappatrier la fonte de mon controle, extraire la LOGFONT, lui appliquer le style gras et ensuite la réappliquer à mon controle.

    Mais bon, pourquoi mon code plus haut ne marche t il pas?

  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
    hum a priori le code est correct ,si ça bug je dirais que GetStockObject a echoué..
    que vaut hDlgFont ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Bon, alors:

    hDlgFont (qui est une handle sur une font) a une valeur. Mais comme c'est une handle, je ne sais pas si elle est valide ou pas. C'est pas un objet au sens C++ donc impossible de voir ce qu'il y a dedans.

    Par contre, ensuite, tmpFont, qui est une cFont construite à partir de hDlgFont (te donc, qui est dérivé sur CGdiObject) a un m_hObject sous jacent NULL (valeur 0x00000000).

    Est ce que si tu essaies ce code chez toi, ça marche?

    Peut être qu'il est impossible de faire un FromHandle d'un stockObject?

  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
    salut,
    apres reflexions ton code n'est pas correcte j'avais pas fait attention a ton utilisation de FromHandle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       LOGFONT boldFont;
        CFont *ptmpFont;
        HFONT hDlgFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
        ptmpFont=CFont::FromHandle(hDlgFont);
        ptmpFont->GetLogFont(&boldFont);
    FromHandle est une fonction static qui fabrique un objet temporaire a partir d'un handle GDI (ici).
    dans ce contexte moi je prefere attacher un handle gdi avec attach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LOGFONT boldFont;
        CFont tmpFont;
        HFONT hDlgFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
        tmpFont.Attach(hDlgFont);
        tmpFont.GetLogFont(&boldFont);
        tmpFont.Detach();
    la fonte obtenue chez moi c'est MS shell DLG et pas la fonte systeme.
    si ça te convient .
    au cas ou dans la faq il y a une classe CFontEx qui permet de fabriquer une CFont en fonction d'un nom de fonte qui va etre cherchée dans le systeme..


  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Merci pour tous ces renseignements.

    Entre temps, j'ai aussi regardé les entrailles du code MFC, et je comprends bien qu'un Attach va créer un object permanent à partir du handle, alors que le FromHandle va créer un objet temporaire, qui va être du type CTempGdiObject*. (mais on pourra toujours appeler les méthodes de CFont dessus, vu que le handle sous jacent est en fait une HFONT. Mais bon, pas très propre, d'où l'intérêt du Attach.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Bon, alors mon but, comme indiqué au tout début, était de mettre la fonte d'un controle de dialogue en gras.

    Au début, j'ai voulu utiliser une fonte système, mais finalement, et comme indiqué dans la FAQ, pourquoi ne pas récupérer directment la fonte du controle, la modifier et la réappliquer au controle...

    Donc, c'est ce que je fais avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CWnd *pWnd = GetDlgItem(IDC_MYCONTROL);
    CFont* pFont = pWnd->GetFont();
    if(pFont!=NULL)
    {
        LOGFONT lf;
        pFont->GetLogFont(&lf);
        lf.lfWeight=FW_BOLD;
        CFont m_font;
        m_font.CreateFontIndirect(&lf);
        pWnd->SetFont(&m_font);
    }
    Au départ, j'ai voulu le faire dans le OnInitDialog, histoire de ne le faire qu'une fois, mais le problème, c'est que quand je fais ça dans le OnInitDialog, ça m'applique une fonte grossie à mon contrôle.
    J'aurais aimé comprendre exactement pourquoi (j'ai l'intuition que c'est parce que le contrôle lui même n'a pas encore été initialisé... D'ailleurs, si je le fais dans le Onpaint du dialoge, alors ça marche très bien.

    Et finalement, quel est le meilleur endroit pour faire cette manip?

    Merci

  9. #9
    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
    re,
    ça doit fonctionner si le traitement est fait apres l'appel de la fonction de la classe de base (CDialog::OnInitDialog) .
    un autre point l'objet CFont m_font; ne doit pas etre local a la fonction mais etre declaré dans la classe de la dialogue pour sa persistance ,
    sinon la fonte est detruite et le handle GDI qui va avec aussi d'ou le probleme...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Exact, ça marche si je créée un object CFont persistant, et même si je le fais dans mon OnInitDialog. Jet pensais que WM_SETFONT copiait le handle de la font pour l'appliquer au controle, mais en fait, elle fait juste pointer la fonte du controle sur le handle en question.

    Par contre, ce qui est étrnage, c'est que si je fais le même traitement que précédemment, sans objet persistant, mais dans le OnPaint, ça marche.
    Ca doit être sans doute parce que le handle de la fonte n'est détruit qu'après la sortie du Onpaint, dans une boucle de type "Idle"...

  11. #11
    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
    certainement ....

Discussions similaires

  1. Comment récupérer une info d'une page internet ?
    Par Magicien d'Oz dans le forum Réseau
    Réponses: 3
    Dernier message: 12/10/2005, 07h38
  2. Comment récupérer une case d'un dbGrid ?
    Par jeje.r dans le forum Composants VCL
    Réponses: 14
    Dernier message: 22/09/2005, 17h56
  3. Réponses: 2
    Dernier message: 17/08/2005, 14h40
  4. Réponses: 8
    Dernier message: 28/01/2005, 08h28
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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