【问题标题】:C++ LogFont Embed Into XPS嵌入到 XPS 中的 C++ LogFont
【发布时间】:2016-07-16 06:10:45
【问题描述】:

我正在尝试将几个 API 结合在一起以促进 XPS 打印。由于 True Type 字体有时会受限于它们的使用方式,因此建议您向操作系统 (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);

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

【问题讨论】:

  • 您还有其他事情要做。这是一个非常基本的错误,表明您的应用程序或环境严重损坏了某些东西。而且我无论如何都不相信这个错误是正确的。它甚至没有被列为函数族可以返回的错误之一。

标签: c++ winapi fonts xps


【解决方案1】:

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

如果成功,则返回 E_NONE。

该函数读取存储在字体中的嵌入权限并将权限转移到pulPrivStatus。

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

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

指定的字体不是 TrueType 字体。

【讨论】:

  • 使用的字体是 Courier New、Arial 和 OCR-A/B 的变体。如果我只是忽略 TTGetEmbeddingType 的返回值并正常使用它们嵌入到我的 XPS 文档中的字体而不会抱怨。
  • @g.d.d.c:显然TTGetEmbeddingType() 不相信该字体是 TrueType 字体。也许CreateFontIndirect() 没有返回您认为的字体(您的示例未验证结果)。
  • 这就是我的困惑(以及问题)的来源。从字面上看,在不到 48 小时前,我正在测试的样本正在工作,但今天它们不是,尽管如果我简单地忽略看似错误的返回值,程序将成功完成文档创建。我已经查看了源更改(没有任何相关的更改),仔细检查了没有发生更新等。XPS 文档中的字体工作
  • 再一次,您没有检查CreateFontIndirect() 的结果。它返回NULL吗?如果不是,GetObject() 是否返回有关您期望的字体的正确详细信息?仅仅因为您向CreateFontIndirect() 询问特定字体并不能保证您会得到该字体:“如果 [CreateFontIndirect] 无法找到完全匹配的字体,它会提供一种替代方案,其特征尽可能多地匹配所请求的特征." 也许你得到的替换字体并不是真正的 TrueType 字体。您是手动填充源LOGFONT,还是查询它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2011-06-22
  • 2010-09-30
  • 1970-01-01
  • 2020-12-12
  • 2014-09-17
相关资源
最近更新 更多