检查字体的嵌入类型

时间:2018-05-08 13:26:49

标签: c++ winapi fonts

在我的应用程序中,我尝试在Windows上安装的组合框字体中列出TrueType并具有嵌入权限 EMBED_EDITABLE ,以便稍后我可以将它们嵌入到PDF中。

首先我用

列出所有字体
EnumFontFamiliesEx(dc, &lf, (FONTENUMPROC)EnumFontProc, lparam, 0);

在我的CALLBACK函数中,我检查:

BOOL CALLBACK WFonteCombo::EnumFontProc(LPLOGFONT lplf, 
                                        LPTEXTMETRIC lptm, 
                                        DWORD dwType, 
                                        LPARAM lpData)
{
    if (dwType == TRUETYPE_FONTTYPE)
    {
        HDC hDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
        _ASSERTE(hDC);

        ::SelectObject(hDC, lplf);

        ULONG privstatus = 0;
        LONG ttStatus;

        ttStatus = ::TTGetEmbeddingType(hDC, &privstatus);

        if (ttStatus == E_NONE)
        {
            if (privstatus == EMBED_EDITABLE)
            {
                //  Do Something.
            }
        }

        ::DeleteDC(hDC);
    }
    return TRUE;
}

TTGetEmbeddingType 正在返回 E_NOTATRUETYPEFONT 但我知道由于我的情况字体是TrueType

if (dwType == TRUETYPE_FONTTYPE)

并且因为返回的第一个字体是此one(TrueType字体)。

我在做错什么想法?

1 个答案:

答案 0 :(得分:0)

如果有人遇到同样的问题。

我的SelectObject错误,我无法选择 LPLOGFONT 首先我必须使用CreateFontIndirect创建一个字体,然后选择 HFONT

HFONT hfont = ::CreateFontIndirect(lplf);
HGDIOBJ hOldFnt = ::SelectObject(hDC, hfont);

错误有点误导,因为它不是TrueType字体,它不是任何类型的字体。

相关问题