从字体名称

时间:2019-05-15 13:28:35

标签: c++ windows winapi true-type-fonts

我正在尝试从已安装的TrueType字体中提取“ post”表,该字体仅按名称知道。我该如何实现?

我已经看到了GetFontData函数,该函数几乎可以实现我想要的功能,只是它从设备上下文的当前加载字体中获取字体数据。就我而言,尽管我没有设备上下文,但只有字体名称。
另外,我已经看到类似的查询,例如this,用于查找和检索整个字体文件,但是由于Windows 可以已经加载并解析了字体文件,因此这似乎不必要且效率低下。字体数据(如我们在GetFontData中看到的)。此外,我不需要整个文件,只需要“ post”表。除了自己全部实施之外,真的没有其他办法吗?

1 个答案:

答案 0 :(得分:2)

可以在没有窗口或GUI的情况下调用GetFontData(...),例如从命令行程序中,只需动态创建虚拟设备上下文并在其中选择一种字体

#include <Windows.h>
#include <vector>

std::vector<unsigned char> GetFontDataByName(const wchar_t* font_name)
{
    HDC hdc = CreateCompatibleDC(NULL);

    auto font = CreateFont(0, 0, 0, 0,
        FW_NORMAL, FALSE, FALSE, FALSE,
        ANSI_CHARSET, OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
        DEFAULT_PITCH,
        font_name);
    SelectObject(hdc, font);
    auto num_bytes = GetFontData(hdc, 0, 0, NULL, 0);
    std::vector<unsigned char> font_data(num_bytes);
    auto result = GetFontData(hdc, 0, 0, &(font_data[0]), num_bytes);

    DeleteDC(hdc);

    return font_data;
}

int main()
{
    auto font_data = GetFontDataByName(L"Times New Roman");

    return 0;
}