2009-10-26 18 views

Odpowiedz

5

Oto stary kod, który wykopałem, który sprawdzi, czy czcionka jest zainstalowana. Może to być spowodowane uporządkowaniem, ale masz pomysł:

static int CALLBACK CFontHelper::EnumFontFamExProc(ENUMLOGFONTEX* /*lpelfe*/, NEWTEXTMETRICEX* /*lpntme*/, int /*FontType*/, LPARAM lParam) 
{ 
    LPARAM* l = (LPARAM*)lParam; 
    *l = TRUE; 
    return TRUE; 
} 

bool Font::IsInstalled(LPCTSTR lpszFont) 
{ 
    // Get the screen DC 
    CDC dc; 
    if (!dc.CreateCompatibleDC(NULL)) 
    { 
     return false; 
    } 
    LOGFONT lf = { 0 }; 
    // Any character set will do 
    lf.lfCharSet = DEFAULT_CHARSET; 
    // Set the facename to check for 
    _tcscpy(lf.lfFaceName, lpszFont); 
    LPARAM lParam = 0; 
    // Enumerate fonts 
    ::EnumFontFamiliesEx(dc.GetSafeHdc(), &lf, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)&lParam, 0); 
    return lParam ? true : false; 
} 
+0

Wielkie dzięki! To działa! – user25749

4

Można użyć EnumFontFamiliesEx, aby sprawdzić, czy istnieje faktyczna czcionka.

UPD: Właśnie dowiedziałem się, że jest zalecane przez MS, aby używać EnumFontFamiliesEx zamiast EnumFontFamilies.

+0

Wielkie dzięki! Ale myślę, że to API jest źle zaprojektowane ... – user25749

+0

Nienawidzę tego, kiedy mnie pokonasz. : [ – GManNickG

+0

@GMan, jest to proces symetryczny :) –

Powiązane problemy