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 :

[Win32] Utilisation de AddFontMemResourceEx [FAQ]


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut [Win32] Utilisation de AddFontMemResourceEx
    Je veux inclure dans mon programme une police spécifique (TTF).

    Je l'ai donc mise en ressources et utilise le code suivant pour y accéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	HRSRC hRes   = FindResource(NULL, MAKEINTRESOURCE(IDR_FONT), _T("TTF"));
    	PVOID lpFont = LockResource(LoadResource(NULL, hRes)); 
    	DWORD dwSize = SizeofResource(NULL, hRes), cFonts = 0;
    		  m_hFont = AddFontMemResourceEx(lpFont, dwSize, NULL, &cFonts);
    Le problème, c'est que quand j'essaye de dessiner avec m_hFont, ça ne marche pas, le système utilise la police par défaut à la place.

    Alors je comprends pas si ce que retourne AddFontMemResourceEx est bien un HFONT ? Ou est-ce que c'est un autre type de handle ? Si oui, comment on accède à la police vu qu'elle n'est pas énumérable (cf MSDN) ??

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    j'essayerais bien
    cFonts = 1

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut
    Ca ne change rien

    Je précise à tout hasard que j'utilise ça pour dessiner (ça marche si j'utilise CreateFont, mais là ça utilise la police par défaut)

    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
    void CPopupWnd::OnPaint()
    {
    	CPaintDC dc(this);
     
    	if(m_Item)
    	{
    		CRect Rect; GetClientRect(Rect);
    		// Texte à dessiner (sur plusieurs lignes)
    		CString Text = m_Item->GetCharacs();
    		// Création de la police utilisée
    		CFont * pFont = CFont::FromHandle(HFONT(theApp.m_hFont));
    		CFont * pOldFont = dc.SelectObject(pFont);
    		// Calcul de la taille du rectangle nécessaire
    		VERIFY(dc.DrawText(Text, Rect, DT_CALCRECT));
    		// Modification de la taille de la fenêtre
    		VERIFY(SetWindowPos(NULL, 0, 0, Rect.right-Rect.left, Rect.bottom-Rect.top, 
    			SWP_NOZORDER | SWP_NOMOVE));
    		dc.SetBkMode(TRANSPARENT);
    		// Dessin du texte
    		VERIFY(dc.DrawText(Text, Rect, DT_LEFT | DT_TOP | DT_WORDBREAK));
    		dc.SelectObject(pOldFont);
    	}
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    Est ce que tu as vérifie les valeurs de retour de chaque fonction ?

    d'autre part, il faudrait peur etre essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FindResource(NULL, MAKEINTRESOURCE(IDR_FONT),RT_FONT) ;

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut
    oui oui la ressource est trouvée, chargée, et la fonction semble installer la police correctement. Le truc, c'est que j'ai pas l'impression que le handle qu'elle me renvoie soit un HFONT...

    Enfin je sais pas trop parce que FromHandle me renvoie bien un pointeur qui n'est pas nul...

    J'y comprends rien là

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    la doc de AddFontMemResourceExrenvoi à SendMessage, je me demande si un WM_FONTCHANGE ne ferait pas du bien

  7. #7
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut
    J'ai essayé ça pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	CFont * Font = CFont::FromHandle(HFONT(theApp.m_hFont));
    	VERIFY(Font->GetLogFont(&LogFont));
    Et l'assertion échoue ! Le handle que me renvoie la fonction n'est pas un HFONT ! Et je sais pas ce que c'est lol, ils disent juste que ça identifie la police de manière unique...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    la, je suis sec. j'ai fait du MSDN et du google sur AddFontMemResourceEx, mais à part un site russe, j'ai rien vu


    bon courage

  9. #9
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut
    :trouve: Sur les forums de Codeguru (c'est vrai que google est pas fort sur ce coup-là)

    Donc après avoir installé la police il faut utiliser CreatePointFont !

    Franchement ils pourraient le mentionner sur MSDN, c'est abusé !

    Exemple de code pour ceux qui pourraient avoir le même problème (ça pourrait peut être rentrer dans la FAQ non, dans "Comment utiliser une police en ressources" ?)

    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
     
    	// Installe la police 
     
    	HRSRC hRes   = FindResource(NULL, MAKEINTRESOURCE(IDR_FONT), _T("TTF"));
    	PVOID lpFont = LockResource(LoadResource(NULL, hRes)); 
    	DWORD dwSize = SizeofResource(NULL, hRes), cFonts = 0;
    	HANDLE hFont = AddFontMemResourceEx(lpFont, dwSize, NULL, &cFonts);
    	ASSERT(cFonts > 0);
     
    	// Crée la police
     
    	CFont Font;
    	VERIFY(Font.CreatePointFont(110, _T("NomDeLaPolice")));
     
    	// ... Utilisation
     
    	// Désinstalle la police
     
    	VERIFY(RemoveFontMemResourceEx(hFont));
    Merci quand même bjousse de m'avoir aidé

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    de rien, ca m'amuse, je ne programme plus windows que rarement et c'est rigolo d'essayer de se rappeler comment on a réglé certaines m.... 7 ou 8 ans plus tot (voire plus....)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/02/2007, 10h19
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. Quel format : coff ou win32 utiliser pour le .o
    Par Guillaume_2357 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 13/04/2005, 13h14
  4. Réponses: 15
    Dernier message: 22/03/2005, 14h45
  5. utilisation composant delphi 7 win32 avec delphi 2005
    Par chtiot dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/02/2005, 06h49

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