在JUCE中嵌入字体

13

我正在寻找一个简单的逐步解决方案来在JUCE中嵌入字体。

我在应用程序中嵌入字体遇到了一些困难(在发布应用程序之前完全忘记了为此付出时间,现在我的应用程序在用户系统上不显示我的字体-可以理解为什么)。

我已经搜索并遵循了有关此主题的所有帖子,但仍然存在问题。我想将嵌入的字体添加到已经通过ProJucer GUI组件创建和布局的标签中。

我已完成以下工作:

1) 将字体添加到我的ProJucer会话中,以便它被添加到BinaryData中

2) 创建了一个名为“EmbeddedFont”的类:

#include "../JuceLibraryCode/JuceHeader.h"

class EmbeddedFonts
{
private:
    Font calistoMT;

public:
    EmbeddedFonts();
    Font& getCalistoMT();
};

EmbeddedFonts::EmbeddedFonts()
{
    // in the line below is where I'm getting the assertion error: jassert (typefaceName.isNotEmpty());
    calistoMT = Font(Typeface::createSystemTypefaceFor(BinaryData::Calisto_MT,
                                                       BinaryData::Calisto_MTSize));
}

Font& EmbeddedFonts::getCalistoMT()
{
    return calistoMT;
}

3) 在我的GUI组件类的标题中创建了一个实例 4) 尝试将此字体传递给标签字体:


3) 在GUI组件类的标题中创建一个实例 4) 尝试将该字体传递给标签字体:
genericLabelName->setFont(embeddedFont.getCalistoMT());

我不太确定该怎么做。另外,在我使嵌入字体工作后,是否应该在projucer GUI组件的字体字段中进行特定设置?我只需将其设置为相同的字体吗?我之所以问是因为在构造函数中我实际上会设置两次字体(一次来自GUI组件选项下拉菜单,一次来自手动编码的嵌入字体)。

我已经尝试了几天,仍然遇到困难。感谢任何帮助。这是我在发布下一个应用程序更新之前必须完成的最后一件事情,所以非常感谢任何协助。


你是否尝试在创建字体后使用 calistoMT->setTypefaceName("来自字体的字体名称")setTypefaceStyle()?浏览字体并确保您指定的字体类型是该字体支持的。 - James Poag
我当时没有尝试过,但现在你提到了它,我正在玩弄这些东西,但我仍然收到相同的jassert。断言:jassert(typefaceName.isNotEmpty());让我相信它弹出是因为typeFaceName包含一些文本,这使我认为它不应该有任何文本,但是无论它是否有文本,jassert仍然会弹出。 - JosephTLyons
此外,我不反对在Projucer中删除标签并通过代码添加它们,现在这样做可能更有意义。 - JosephTLyons
1个回答

1

看起来您在JUCE方面做得很正确,我认为您尝试加载的字体文件没有与之关联的名称。我建议尝试以下操作:

  • 在将createSystemTypefaceFor调用返回的Typeface传递给Font构造函数之前,请检查其名称。我相信它应该有一个getName()或类似的调用来获取其名称。如果该名称为空(鉴于您的断言,我希望是这样),那么问题就出在这里。

  • 您可以尝试下载一个TTF文件查看器,以便了解您要加载的文件的一些信息。它还可以指示您读取的字体是否具有名称。如果它似乎在其元数据中有一个名称,则可能表明JUCE库中存在错误。

  • 您可以尝试加载不同的字体或您知道元数据中具有正确名称的不同字体(因为您已经使用某种查看器或工具进行了检查),并查看为它们创建的类型面是否设置了名称,如果是,则尝试从其中一个类型面创建Font并查看是否成功。

如果实际加载的字体确实设置了名称,那么这个理论有点站不住脚,但我仍然会尝试第三步,看看您是否始终使用每种字体都出现此错误,还是仅限于其中一种字体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接