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+ の問題であると考えています。