使用Windows API输出系统上所有的字体

63 阅读1分钟

使用的API

Windows API简述
EnumFontFamilies枚举字体的函数

代码

#include <Windows.h>
#include <stdio.h>


BOOL CALLBACK EnumFamCallBack(
    LPLOGFONT lplf,  // 逻辑字体结构指针
    LPNEWTEXTMETRIC lpntm, // 字体信息
    DWORD FontType,  // 字体的类型,windows中字体分为三种类型,光栅字体,矢量字体,TrueType字体
    LPARAM aFontCount)   // EnumFontFamilies传给回调函数的其他数据
{
    PINT aiFontCount = (PINT)aFontCount;  // 转为数组
    if (FontType & RASTER_FONTTYPE)
    {
        // 光栅字体

        aiFontCount[0]++;
    } else if (FontType & TRUETYPE_FONTTYPE)
    {
        // TrueType字体
        aiFontCount[2]++;
    } else
    {
        aiFontCount[1]++;
    }

    // 打印字体名称和是否为斜体
    printf("fontName: %ls\tItalic=%d\n", lplf->lfFaceName, lplf->lfItalic);

    if (aiFontCount[0] || aiFontCount[1] || aiFontCount[2])
    {
        return TRUE;
    }

    return FALSE;

}

DWORD ListFont(HWND hwnd)
{
    // 获取窗口DC,nullptr为获取桌面的
    HDC hdc = GetDC(hwnd);

    int aFontCount[] = { 0, 0, 0 };  // 传给回调函数的数据,我们用该数据对数据类型进行计数

    // 枚举字体的函数,每找到一个字体调用一次回调函数
    EnumFontFamilies(hdc, nullptr, (FONTENUMPROC)EnumFamCallBack, (LPARAM)aFontCount);

    printf("光栅字体个数:%d\n", aFontCount[0]);
    printf("矢量字体个数:%d\n", aFontCount[1]);
    printf("TrueType字体个数:%d\n", aFontCount[2]);

    return 0;
}

int main()
{

    ListFont(nullptr);

    return 0;
}

测试效果

image.png