首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PrivateFontCollection with gdi+有时在WIndows 8或更高版本中使用错误的FontStyle

PrivateFontCollection with gdi+有时在WIndows 8或更高版本中使用错误的FontStyle
EN

Stack Overflow用户
提问于 2015-06-30 14:17:12
回答 1查看 558关注 0票数 2

如果您有一个从PrivateFontCollection创建的字体,并尝试使用GDI+绘制字符串,它有时会使用错误的FontStyle。

我观察到了这一点:字体从内存加载到PrivateFontCollection,字体从文件加载到PrivateFontCollection。

在下面的示例中,我将从文件中加载字体。我把它们都放在一个叫做字体的文件夹里。如果我们能像下面这样装载它们。

代码语言:javascript
复制
    private void loadFontsIntoPrivateCollection()
    {
        _privateFontCollection = new PrivateFontCollection();
        _families = new Dictionary<string, FontFamily>();

        var files = Directory.GetFiles("Fonts");
        foreach (var file in files)
            _privateFontCollection.AddFontFile(file);

        foreach (var fontFamily in _privateFontCollection.Families)
        {
            _families.Add(fontFamily.Name, fontFamily);
            comboBox1.Items.Add(fontFamily.Name);
        }

        comboBox1.Text = "Californian FB";
    }

然后尝试使用以下代码绘制字符串OnPaint

代码语言:javascript
复制
    private void panelTextArea_Paint(object sender, PaintEventArgs e)
    {
        var familyToUse = _families[comboBox1.Text];
        var fontToUse = new Font(familyToUse, 28, _styleToUse, GraphicsUnit.World);
        e.Graphics.DrawString(textBox1.Text, fontToUse, Brushes.Black, panelTextArea.ClientRectangle);
    }

然后,在大多数情况下,字符串将绘制对应于FontStyle.Regular的字体。我注意到,如果您首先要小心加载常规字体,那么FontFamily会伪造除FontStyle.Regular之外的任何其他FontStyle。不管您是否将它们加载到PrivateFontCollection中。

下面是一些我见过这种行为的字体。

  • 余哥特
  • 加利福尼亚FB
  • Tw Cen MT
  • 鳃Sans MT
  • 柏林Sans FB
  • BrowalliaUPC
  • 传统阿拉伯语

当在Graphics.DrawString()和AddString上执行graphicsPath时,我看到了这种行为。使用TextRenderer.DrawText()将正确绘制字体。

您应该能够在Windows 8或10中轻松地重新创建这种行为,只需使用它们用于PrivateFontCollection https://msdn.microsoft.com/en-us/library/windows/desktop/ms533820(v=vs.85).aspx的示例代码

从我和微软在这种行为上的通信来看,他们认为这是gdi+的一个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-28 09:16:36

我们注意到,如果您只将一个FontStyle加载到PrivateFontCollection中,那么它将始终使用该FontStyle。

我们所做的是包装PrivateFontCollection和FontFamily类,因此当我们将字体从文件加载到PrivateFontCollection中时,它实际上会将字体添加到4个PrivateFontCollections中的一个中,这取决于字体文件所具有的字体。

然后,通过调用我们自己的FontFamily类来创建字体,该类具有从适当的PrivateFontCollection中选择字体的逻辑。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31140819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档