3

在 windows CE 6 下,我使用 AddFontResource() 将 arialuni.ttf(Arial Unicode MS,版本 1.0.1)加载到系统字体列表中,我们支持的所有远东语言(日语、韩语、简体中文和繁体中文)都会出现当文本使用字体绘制到屏幕时正确。

在 Windows Compact 7 下,相同的技术不会在屏幕上产生远东字符。我得到的是空框,而不是屏幕上出现的实际字符,这是我在字体不支持必要的字符集时看到的。

我对两个平台使用相同的代码和相同的字体文件。我已经调试了代码以验证 a) 操作系统声称字体实际上是通过 AddFontResource() 加载到系统字体列表中的,b) 操作系统声称字体在实际绘制文本之前加载到屏幕设备上下文中, 和 c) 实际的远东字符在我移交给 DrawText() 的缓冲区中。这与在 CE6 下工作的东西完全相同。

奇怪的是,无论我是否加载 arialuni.ttf,我们支持的东欧语言(俄语、捷克语、保加利亚语)都能在 Windows Compact 7 上正确显示。注册表说默认系统字体是 Tahoma,但我认为 Tahoma 不支持除了基本的西欧语言之外的任何东西。它不在CE6之下。

我宁愿不添加或使用其他字体。Arialuni.ttf 几乎支持我们可能支持的每一种语言,而且它已经是我们用于非西欧语言的唯一一种。

已经安装了其他几种真字体,因此该选项(而不是光栅字体)已经在我们的操作系统版本中。

  1. 这个 arialuni.ttf 是否与 Windows Compact 7 兼容?
  2. 您是否必须在操作系统映像中构建一些东西来添加对远东语言的支持,以使这种类型的字体加载和文本绘制工作?
  3. 我对 Tahoma 有什么误解吗?它现在支持东欧语言?
  4. 我错过了什么?

感谢您的任何想法。

4

1 回答 1

2
  1. 这个版本的 arialuni.ttf 确实兼容 Windows Compact 7。

  2. 不清楚。操作系统图像的某些内容允许 CE6 下的字体映射器正确映射我们的请求,但在 CE7 下则不行。

  3. 不。CE7 中内置的默认 tahoma.ttf 支持东欧字符集,但不支持远东字符集。

  4. 我们的程序调用 CreateFontIndirect() 来获得一个 GDI 字体资源的句柄,我们可以在将文本绘制到屏幕时将其选择到屏幕的设备上下文中。这个调用使用了一个 LOGFONT 结构,我们用我们想要的字体的属性来填充它,在幕后,系统的字体映射器组件会查看它所知道的字体并返回它认为最匹配的字体。

    最初,我们只指定字符高度、重量和字体系列名称。默认情况下,请求的字符集是 ANSI_CHARSET (0)。这总是返回我们对 CE6 平台上的 arialuni.ttf 字体的引用。然而,在我们的 CE7 平台上,字体映射器将请求映射到 tahoma.ttf 文件。

    我修改了 LOGFONT 结构内容以包括询问日语字符集 (LOGFONT.lfCharSet = SHIFTJIS_CHARSET)。在这两个平台上,只有 arialuni.ttf 字体文件支持这种语言,所以两个字体映射器现在总是向我们返回对所需字体的引用。

    此更改适用于 CE6 和 CE7 平台。西欧、东欧和远东语言现在都可以正确绘制,因为 arialuni.ttf 支持所有这些字符集等等。

不清楚为什么 CE6 平台正确映射了字体而 CE7 平台没有。我们控制设备中内置的字体,因此我们可以保证仅 arialuni.ttf 支持日文字符的唯一性。这显然足以让字体映射器执行我们想要的操作。

于 2016-05-04T19:21:11.567 回答