C ++ LogFont嵌入XPS

时间:2016-03-28 21:33:04

标签: c++ winapi fonts xps

我试图将几个API结合在一起以促进XPS打印。由于True Type字体有时受限于它们的使用方式,因此建议您在OS(Windows)中查询与字体相关的许可证。我发现这样做的被禁止的方法看起来像这样:

HDC hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
// logfont is a valid instance of LOGFONTW
HGDIOBJ hfont = ::CreateFontIndirect(&logfont);
if (!SelectObject(hDC, hfont)) 
    return;
ULONG privstatus = 0; 
LONG ttStatus; 
ttStatus = TTGetEmbeddingType(hDC, &privstatus);

此时,如果E_NONE成功,则ttStatus应为TTGetEmbeddingType,而privstatus应为{EMBED_PREVIEWPRINT, EMBED_EDITABLE, EMBED_INSTALLABLE, EMBED_NOEMBEDDING}之一。我有这个例子星期五工作。今天,当我运行我的可执行文件时,TTGetEmbeddingType返回0x0A (E_NOTATRUETYPEFONT)而不是E_NONE。笏?我是否遗漏了操作系统确定是否可以嵌入字体的能力的基本信息?

1 个答案:

答案 0 :(得分:3)

您引用的错误消息文本(" 环境不正确")属于ERROR_BAD_ENVIRONMENT系统错误代码,其数值为10(的0x0A)。但是,TTGetEmbeddingType()不会返回系统错误代码。 TTGetEmbeddingType() documentation州:

  

如果成功,则返回E_NONE。

     

此函数读取存储在字体中的嵌入权限,并将权限传递给pulPrivStatus。

     

否则,返回Embedding-Function Error Messages中描述的错误代码。

如果您查看T2embapi.h中的实际定义,0x000A的返回值为E_NOTATRUETYPEFONT

  

指定的字体不是TrueType字体。