C++ 检查字体的嵌入类型

C++ 检查字体的嵌入类型,c++,winapi,fonts,C++,Winapi,Fonts,在我的应用程序中,我试图在一个组合框中列出安装在TrueType窗口上的字体,这些字体具有嵌入权限EMBED\u EDITABLE,以便以后可以将它们嵌入到PDF中 首先,我列出所有带有 EnumFontFamiliesEx(dc, &lf, (FONTENUMPROC)EnumFontProc, lparam, 0); 在回调函数中,我检查: BOOL CALLBACK WFonteCombo::EnumFontProc(LPLOGFONT lplf,

在我的应用程序中,我试图在一个组合框中列出安装在TrueType窗口上的字体,这些字体具有嵌入权限EMBED\u EDITABLE,以便以后可以将它们嵌入到PDF中

首先,我列出所有带有

EnumFontFamiliesEx(dc, &lf, (FONTENUMPROC)EnumFontProc, lparam, 0);
在回调函数中,我检查:

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\u NOTATRUETYPEFONT,但由于我的情况,我知道字体是TrueType

if (dwType == TRUETYPE_FONTTYPE)
因为返回的第一个字体是这个(TrueType字体)


你知道我做错了什么吗?

以防有人遇到同样的问题

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

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

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

您泄漏了该DC中最初的字体。您的调用是错误的,原因更为普通:它从未评估返回值,这确实表示成功和失败。基本上,您没有检查错误。