設置 | 登錄 | 註冊

作者共發了4篇帖子。

【函數】判斷字體是否存在(即是否已安裝)的函數

1樓 巨大八爪鱼 2016-5-24 17:16
int CALLBACK FontExistsProc(const LOGFONT *lpelfe, const TEXTMETRIC *lpntme, DWORD FontType, LPARAM lParam)
{
    return 0; // 直接終止EnumFontFamiliesEx函數的運行
}

// 判斷字體是否存在的函數
BOOL FontExists(LPLOGFONT lpFont)
{
    HDC hdc = GetDC(NULL);
    BOOL bResult = (EnumFontFamiliesEx(hdc, lpFont, FontExistsProc, (LPARAM)NULL, (DWORD)NULL) == 0);
    ReleaseDC(NULL, hdc);
    return bResult;
}
2樓 巨大八爪鱼 2016-5-24 17:41
【示例C語言控制台程序:判斷一系列的字體是否存在】
#include <conio.h>
#include <locale.h>
#include <tchar.h>
#include <Windows.h>

int CALLBACK FontExistsProc(const LOGFONT *lpelfe, const TEXTMETRIC *lpntme, DWORD FontType, LPARAM lParam)
{
    return 0; // 直接終止EnumFontFamiliesEx函數的運行
}

// 判斷字體是否存在的函數(1)
BOOL FontExists(LPLOGFONT lpFont)
{
    HDC hdc = GetDC(NULL);
    BOOL bResult = (EnumFontFamiliesEx(hdc, lpFont, FontExistsProc, (LPARAM)NULL, (DWORD)NULL) == 0);
    ReleaseDC(NULL, hdc);
    return bResult;
}

// 判斷字體是否存在的函數(2)
BOOL FontNameExists(LPTSTR szFontName)
{
    LOGFONT logfont;
    ZeroMemory(&logfont, sizeof(logfont));
    logfont.lfCharSet = DEFAULT_CHARSET;
    lstrcpy(logfont.lfFaceName, szFontName);
    return FontExists(&logfont);
}

int main(void)
{
    int i;
    LPTSTR list[] = {TEXT("黑體"), TEXT("白體"), TEXT("楷體"), TEXT("Times New Roman"), TEXT("楷體_GB2312"), TEXT("Consolas")};
    int n = sizeof(list) / sizeof(list[0]); // 字符串個數

    setlocale(LC_ALL, "chs");
    for (i = 0; i < n; i++)
    {
        if (FontNameExists(list[i]))
            _tprintf(TEXT("字體「%s」存在\n"), list[i]);
        else
            _tprintf(TEXT("字體「%s」不存在\n"), list[i]);
    }

    _getch();
    return 0;
}
3樓 巨大八爪鱼 2016-5-24 17:42
【Win7下的運行效果】


【WinXP下的運行效果】

4樓 巨大八爪鱼 2016-5-24 18:14
本來直接調用EnumFontFamiliesEx這個API函數也是可以的,但是這個函數非要傳一個函數指針進去,不傳不行,所以用起來不是很方便。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。