FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, 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
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 ); |
- 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); } |
Code c++ : | Sélectionner tout |
1 2 3 | CFontEx Font; Font.GetFont(10,"Arial"); |
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); |
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. |
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)); |
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 çaLes 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 © 2024 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.