2009-10-26 56 views

Trả lời

5

Dưới đây là một số mã cũ mà tôi đã khai thác để kiểm tra xem phông chữ đã được cài đặt hay chưa. Nó có thể làm với việc được dọn dẹp nhưng bạn có được ý tưởng:

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

Rất cám ơn! Nó hoạt động! – user25749

4

Bạn có thể sử dụng EnumFontFamiliesEx để tìm xem có tồn tại phông chữ thực tế hay không.

UPD: Tôi vừa mới biết rằng MS khuyên dùng EnumFontFamiliesEx thay vì EnumFontFamilies.

+0

Rất cám ơn! Nhưng tôi nghĩ rằng API này được thiết kế kém ... – user25749

+0

Tôi ghét nó khi bạn đánh tôi. : [ – GManNickG

+0

@GMan, nó là một quá trình đối xứng :) –

Các vấn đề liên quan