FAQ VC++ et MFCConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 546, dernière mise à jour : 5 avril 2013  Ajouter une question

 

Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++

Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture. Farscape


SommaireContrôlesGestion des Fontes (4)
précédent sommaire suivant
 

Il faut utiliser la fonction EnumFontFamiliesEx qui permet de parcourir les fontes en fonctions des éléments définis dans la structure LOGFONT conjointement avec une fonction callback

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
  
  
int EnumFontFamiliesEx( 
  HDC hdc,                          // handle to DC 
  LPLOGFONT lpLogfont,              // font information 
  FONTENUMPROC lpEnumFontFamExProc, // callback function 
  LPARAM lParam,                    // additional data 
  DWORD dwFlags                     // not used; must be 0 
);
Voici un exemple d'implémentation qui permet de créer une fonte d'après les infos d'une fonte système ainsi que son dimensionnement en nombre de points. Plusieurs choses sont à remarquer dans cette classe :

  • La création d'un DC pour l'écran ;
  • La définition et l'utilisation d'une fonction callback et sa communication avec l'instance de la classe.

Code c++ : Sélectionner tout
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
  
class CFontEx : public CFont 
{ 
public: 
    bool GetFont(LOGFONT *plogfont, 
             int nbpoints, 
             const char *szFontName, 
             const char *szFontFullName="", 
             CDC *pDC=NULL); 
    bool GetCFont(CFont &refCFont , 
              int nNbPoints, 
              const char *szFontName, 
              const char *szFontFullName="", 
              CDC *pDC=NULL); 
  
    bool GetFont(int nNbPoints, 
             const char *szFontName, 
             const char *szFontFullName="", 
             CDC *pDC=NULL); 
  
    CDC *CreateScreenDC(void); 
  
private: 
    CString m_strFontName,m_strFontFullName; 
    LOGFONT *m_pCurrentLogFont; 
    bool m_bFind; 
  
static BOOL CALLBACK AFX_EXPORT EnumFontFamiliesCallBack(ENUMLOGFONTEX* pelf, 
                                                         NEWTEXTMETRICEX* /*lpntm*/,  
                                                         int FontType, LPVOID pThis); 
};
Code c++ : Sélectionner tout
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  
BOOL CALLBACK AFX_EXPORT  
CFontEx::EnumFontFamiliesCallBack(ENUMLOGFONTEX* pelf,N 
                                  EWTEXTMETRICEX* /*lpntm*/, 
                                  int FontType, LPVOID pThis) 
{ 
    CString k=pelf->elfLogFont.lfFaceName; 
    CFontEx *pFont=(CFontEx *)pThis; 
  
    // recherche d'une fonte specifique 
    if(pFont->m_strFontName!="" &&  
        pFont->m_strFontName!=pelf->elfLogFont.lfFaceName) return(1); 
  
    if(pFont->m_strFontFullName!="") 
        if(pFont->m_strFontFullName!=pelf->elfFullName) return(1); 
  
    if(pFont->m_strFontFullName=="") 
        if(pelf->elfFullName!=pFont->m_strFontName) return(1);  
  
    memmove(pFont->m_pCurrentLogFont,&pelf->elfLogFont,sizeof(LOGFONT)); 
    pFont->m_bFind=true; 
    return(0); 
} 
CDC *CFontEx::CreateScreenDC(void) 
{ 
  
    static CDC *pDC=NULL; 
    HDC hDC; 
    hDC = ::GetDC(NULL); 
    pDC = CDC::FromHandle(hDC);  
    return (pDC); 
}  
  
bool CFontEx::GetFont(int nNbPoints, 
                      const char *szFontName, 
                      const char *szFontFullName /*=""*/, 
                      CDC *pDC /*=NULL*/) 
{ 
  
//  
    return GetCFont(*this, 
                    nNbPoints, 
                    szFontName, 
                    szFontFullName, 
                    pDC); 
} 
  
bool CFontEx::GetCFont(CFont &refCFont, 
                       int nNbPoints, 
                       const char *szFontName, 
                       const char *szFontFullName /*=""*/, 
                       CDC *pDC /*=NULL*/) 
{ 
  
//  
    LOGFONT lf; 
    if(refCFont.m_hObject) refCFont.DeleteObject(); 
    if(GetFont(&lf,nNbPoints,szFontName,szFontFullName,pDC)) 
    return (refCFont.CreateFontIndirect(&lf)==TRUE);  
    return false; 
} 
bool CFontEx::GetFont(LOGFONT *plogfont, 
                      int nbpoints, 
                      const char *szFontName, 
                      const char *szFontFullName /*=""*/, 
                      CDC *pDC /*=NULL*/) 
  
{  
  
    bool bAutoDC=false; 
    nbpoints*=10;  
  
    m_strFontName=szFontName; 
    m_strFontFullName=szFontFullName; 
    m_pCurrentLogFont=plogfont; 
    m_bFind=false; 
  
    if(pDC==NULL) 
    {  
        pDC=CreateScreenDC(); 
        bAutoDC=true; 
    } 
  
    LOGFONT lf;  
    memset(&lf, 0, sizeof(LOGFONT)); 
    lf.lfCharSet = DEFAULT_CHARSET;  
  
    if(!m_strFontName.IsEmpty()) 
    strcpy(lf.lfFaceName,m_strFontName); 
    else m_strFontName="Courier New"; 
  
    ::EnumFontFamiliesEx(pDC->m_hDC, &lf, 
            (FONTENUMPROC) CFontEx::EnumFontFamiliesCallBack, 
            (LPARAM)this ,0); 
  
    if(m_bFind) 
    { 
        plogfont->lfHeight =-MulDiv(nbpoints,pDC->GetDeviceCaps(LOGPIXELSY),72); 
        plogfont->lfHeight/=10; 
        if(nbpoints<0) plogfont->lfHeight=abs(plogfont->lfHeight);  
        plogfont->lfWidth=0; 
    } 
    if(bAutoDC) pDC->DeleteDC(); 
    return(m_bFind); 
}
exemple d'utilisation demande d'une fonte de type Arial en 10 points .

Code c++ : Sélectionner tout
1
2
3
  
CFontEx Font;  
Font.GetFont(10,"Arial");

Mis à jour le 5 avril 2013 farscape

En manipulant les valeurs lfEscapement et lfOrientation de la logfont.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
// reglage de la fonte en mode vertical: 
LOGFONT lf; 
//1 récupération des paramètres d'une CFont ou d'une fenêtre   
VERIFY(pCurrentFont->GetLogFont(&lf)); 
// 2 changement des valeurs 
lf.lfEscapement=900; 
lf.lfOrientation=900; 
// Création de la nouvelle fonte 
CFont FontVert; 
VERIFY(FontVert.CreateFontIndirect(&lf)); 
CFont *pOldFont=dc.SelectObject(&FontVert); 
  
// Affichage final d'une chaîne stext, dans le rectangle rectText calculé au préalable bien sur. 
UINT nFormat=DT_LEFT|DT_SINGLELINE; 
dc.DrawText(sText,&rectText,nFormat|DT_CALCRECT);
Pour de plus amples détails voir l'aide sur la structure LOGFONT

Mis à jour le 5 avril 2013 farscape

Exemple modification de la fonte d'un static en gras.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  
   CWnd *pWnd = GetDlgItem(IDC_STATIC1); 
   CFont* pFont = pWnd->GetFont(); 
   if(pFont!=NULL) 
   { 
      LOGFONT lf; 
      pFont->GetLogFont(&lf); 
      lf.lfWeight=FW_BOLD;//mettre l'attribut en gras par exemple. 
      // CFont m_font;  // objet local à la classe parent fenetre CDialog,CFormView 
  
      m_font.DeleteObject();  // destruction GDI de l'ancien objet eventuellement 
      m_font.CreateFontIndirect(&lf); // creation de la fonte d'apres la LOGFONT 
    } 
    pWnd->SetFont(&m_font);  // affectation de la nouvelle fonte.

Mis à jour le 5 avril 2013 farscape

On Procédera comme suit :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
    // 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));
Pour insérer la fonte dans les ressources on procédera comme indiqué dans ce post de la faq : Comment émettre un son ?

Mis à jour le 17 septembre 2007 farscape

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique C++