2

PrivateFontCollection から作成したフォントがあり、GDI+ を使用して文字列を描画しようとすると、間違った FontStyle が使用されることがあります。

これは、メモリから PrivateFontCollection に読み込まれたフォントと、ファイルから PrivateFontCollection に読み込まれたフォントの両方で観察されました。

次の例では、ファイルからフォントをロードしています。私はそれらをすべてFontsというフォルダに入れています。以下のようにロードするとします。

    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 を描画しようとします

    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
  • トゥセン MT
  • ギル サンズ MT
  • ベルリン サンズ FB
  • ブロワリアUPC
  • 繁体字アラビア語

GraphicsPath で Graphics.DrawString() および AddString を実行すると、この動作が見られます。TextRenderer.DrawText() を使用すると、フォントが正しく描画されます。

PrivateFontCollection https://msdn.microsoft.com/en-us/library/windows/desktop/ms533820(v=vs.85) のサンプル コードを使用するだけで、Windows 8 または 10 でこの動作を簡単に再現できるはずです。 aspx

この動作に関する Microsoft とのやり取りから、彼らはこれが gdi+ の問題であると考えています。

4

1 に答える 1