问题标签 [privatefontcollection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2055 浏览

c# - 将资源中的字体加载到 PrivateFontCollection 会导致重新发布损坏

我在将字体从资源加载到 PrivateFontCollection 时遇到了一些困难。

当我开始这个时,我成功地从文件中加载了字体,但是我希望将字体嵌入到我的项目中(因此用户端的文件混乱更少,应用程序运行时的 IO 也更少)。

下面的代码将加载字体,获取正确的名称,并允许缩放,但是没有一个字符正确显示。

示例用法:

这是从内存加载的样子: 从内存加载

这是从文件加载的样子: 从文件加载

我在嵌入式资源和基于文件的测试中都使用了当前的 FontAwesome TTF 文件。似乎嵌入时,翻译或从嵌入加载时丢失或打乱了某些东西。我需要帮助来完成这项工作,以便我可以将嵌入资源中的字体加载到 PrivateFontCollection 中。

我在 SO 上查看了一些“解决方案”,但是它们已经过时了,并且 Visual Studio 2013 中不再提供部分或全部命令/访问器(文章解决方案来自 4-5 年前)。一些示例“解决方案”以及为什么它们不起作用:

解决方案 #1 - 这不起作用,因为字体的访问器字符串返回 null。就我而言,访问器是MyProject.Properties.Resources.fontawesome_webfont

解决方案 #2 - 此解决方案最接近,但再次用于访问资源的方法不再有效。我上面的代码实现了一个收获版本,去掉了将 byte[] 数组传递到内存然后从内存加载的核心概念。由于在我的情况下,资源的 get{} 属性已经返回了一个 byte[] 数组,因此无需将其“转换”为字节数组,因此我(似乎)能够安全地删除该部分代码更新它以使用较新的访问器。

无论哪种情况,我都想要一个解决这个问题的方法,它允许我将嵌入资源中的字体文件加载到 PrivateFontCollection 中。

0 投票
1 回答
2861 浏览

c# - 如何将字体从 privatefontcollection 内存渲染到可编辑控件

这是将字体从资源加载到 PrivateFontCollection 导致损坏的延续

此处提供的答案对于具有可用方法的控件来说已经足够了UseCompatibleTextRendering,但是它似乎不适用于以文本为主要焦点的其他常见控件,例如:

  • 列表显示
  • 文本框
  • 富文本框
  • 组合框
  • ... 还有很多...

我已经尝试了这里的信息,这些信息基本上是在玩弄Application.SetCompatibleTextRenderingDefaultin Program.cs(没有人澄清默认情况下这个设置在哪里,所以我在这里记录它)。我也玩过 Telerik、DevExpress 和 Infragistics 文本控件,除了 Telerik 之外的所有文本控件都没有内置兼容文本渲染的能力。 Teleriks 控件有方法,但是它的效果为零,包括未能将前景色设置为存储的内容在属性中(另一种动物,只是注意到 Telerik radTextBox 控件的故障)。

似乎无论我如何对其进行切片,任何对文本实际有用的控件都不会使文本正确显示方形字符,如上面提到的原始帖子中所述。

总之 :

  • 字体正在从资源加载到内存到 PrivateFontCollection
  • 应用程序不会崩溃
  • 在标签上成功使用了相同的字体(UseCompatibleTextRendering 对它们起作用) - 在同一个表单上,在同一个项目中。

  • 受此(新?)问题影响的控件严格来说是任何可能“键入”的控件,例如 TextEdit、ListView、RichText、Combo 等

  • 当谈到切换、玩弄或玩弄时——这意味着我已经尝试了所有可能的所述控件和/或提供给我的代码的组合。例如: Application.SetCompatibleTextRenderingDefault本身只有 3 种可能的组合。 (true) (false)或完全省略。完成这 3 个组合后,我继续(此处为基本故障排除,但我发现有必要解释以涵盖所有基础)添加 Telerik 控件,然后尝试 Telerik 控件中的所有组合以及Application.SetCompatibleTextRenderingDefault命令的所有组合。测试的数量是指数的,即呈现可能性的可能组合的数量乘以尝试的控件数量乘以每个控件具有的呈现控件的可能性数量,等等。

0 投票
1 回答
591 浏览

c# - 从资源创建 PrivateFontCollection 的问题

几个月来我一直在运行同样的代码,它就像一个魅力。最近,我将此代码添加到 TFS 的源代码控制中,但它不再正常工作。唯一的变化是修改了一些命名空间以满足我们的产品指南。目的是创建一个pfc作为资源嵌入文件中的字体 - 原因是可执行文件是可移植的,并且除了安装适当的 .NET 版本之外不依赖任何东西。

突然发生的事情是所有字体都没有加载到字典中。据我在调试时所说,资源很好。它正确循环所有字体资源。然而,当它到达s_FontCollection.AddMemoryFont它开始跳过一些。我试图弄清楚如何Status从方法中读取返回值(如此处所述),但似乎无法使其工作。老实说,我没有更改与此相关的其他代码。

真正奇怪的部分是它在执行时是一个问题。我可以多次运行相同的构建,并最终得到关于可用字体的不同结果。

0 投票
1 回答
609 浏览

winforms - 未安装字体时 System::Drawing::Text::PrivateFontCollection 不起作用

我尝试从内存(嵌入式资源)添加字体并将其用于我的 windows 窗体(c++/cli)应用程序...代码正在运行,但是当计算机上未安装指定的字体时,文本框使用默认字体而不是我的自定义字体。CompatibleTextRenderingDefault 设置为 true。

0 投票
1 回答
870 浏览

c# - PrivateFontCollection.AddFontFile() 抛出通用 GDI+ 错误异常

在装有 Windows 10 Pro 的本地开发机器上添加私有字体可以正常工作。但是在 Windows Server 2012 R2 上,相同的代码会导致以下错误:

System.Runtime.InteropServices.ExternalException:GDI+ 中出现一般错误。在 System.Drawing.Text.PrivateFontCollection.AddFontFile(字符串文件名)

当我删除文件时,它会导致 NotFoundException,因此文件路径必须正确。我确保每个用户都拥有该文件的所有可能权限。(我发现如果我拒绝本地 win 10 机器上的所有权限,则会发生相同的“一般错误” - 所以这可能是权限问题)

有没有人解决这个问题?生产机器上的服务用户是否可能缺少“安装”私有字体所需的其他一些权限?也许字体被安装到一个不允许的特定目录 - 但我找不到它会在哪里。请帮助我解释这个自我解释的“一般错误”。

0 投票
1 回答
573 浏览

c# - 将字体系列从磁盘加载到 PrivateFontCollection

我正在使用以下代码将字体加载到内存中,以便使用 GDI+ 生成图像:

没有异常,但是在AddFontFile方法运行后 fontCollection Families 属性为空,没有任何异常。

我已验证路径有效(File.Exists返回true):

当我打开文件时,TTF 文件似乎工作正常,所以它不是无效的 TTF 文件: https://dl.dropboxusercontent.com/u/4899329/2016-10-12_22-44-52.png

有什么建议么?

0 投票
1 回答
274 浏览

c# - 如何始终通过 C# 中的 PrivateFontCollection 获取英文字体名称?

现在我通过以下代码获取字体名称:

在英文Win7系统上,我得到“DFPHeiMedium-UN”,但在中文Win7系统上,我得到“华康中黑体(P)-UN”。因此,字体名称在不同的系统语言中有所不同。

我的问题是如何编写代码以确保无论系统语言如何,我都能始终获得“DFPHeiMedium-UN”?

谢谢你。

顺便说一句,我尝试了 CurrentCulture。我把这一行放在上面的代码之前。还是不行。Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");

0 投票
1 回答
302 浏览

c# - C# PrivateFontCollection AddFontFile 从相对路径

我从根目录的这个文件夹中有 OpenSans-Light.ttf:~/fonts/open-sans/OpenSans-Light.ttf

但我得到“System.IO.FileNotFoundException:找不到文件”

如何定位该字体文件?

0 投票
1 回答
915 浏览

c# - PrivateFontCollection 系列不可靠,迭代次数越多

我已将 MemoryStream 加载到 PrivateFontCollection 并打印 Font-Family 计数。

我已经完成了 10 次这些过程,并且我希望每次迭代都有相同的输出。我想要两次迭代的正确输出,有时第一次迭代也会出错。我不能有一致的输出。

为我提供一个使用 PrivateFontCollection 获得一致输出的解决方案。
注意:字体文件夹包含 5 种不同的字体。

10 次的预期输出:
1 迭代和族数:5
2 迭代和族数:5
3 迭代和族数:5
4 迭代和族数:5
5 迭代和族数:5
6 迭代和族数:5
7 迭代和家庭计数:5
8 迭代和家庭计数:5
9 迭代和家庭计数:5
10 迭代和家庭计数:5

实际输出:[不一致的输出]
1 迭代和族数:5
2 迭代和族数:5
3 迭代和族数:5
4 迭代和族数:5
5 迭代和族数:4
6 迭代和族数:3
7迭代和族数:3
8 迭代和族数:4
9 迭代和族数:4
10 迭代和族数:4

0 投票
0 回答
275 浏览

c# - PrivateFontCollection 在.Net Core 下添加内存字体失败

我需要将一组字体添加到PrivateFontCollection. 由于某种原因,这个任务应该通过使用AddMemoryFont函数来完成。

运行上面的代码后,我得到以下输出:

这个结果非常令人困惑……

如果我取消注释以下行:

然后我得到:

这个结果也令人困惑。

如何解释这些结果?什么是正确的使用方法PrivateFontCollection.AddMemoryFont

环境:

  • Windows 10 家庭版

  • .Net 核心 2.2.106

  • System.Drawing.Common 4.7.0