Introduction

WinForms で ListView を使った時、下記のような例外を投げる時がある。

exception

SystemSystem.ArgumentException: ‘TrueType フォントのみがサポートされています。これは TrueType フォントではありません。’

そのままの説明なのだが、通常の使用方法では遭遇することはない。

Why?

調べた限り、この例外に遭遇するのは、 ListViewOwnerDrawtrue を設定している状態で、下記のパターンに該当した時。

  • System.Drawing.Text.PrivateFontCollectionAddFontFile メソッドを使用してファイルから読み込んだ Open Type Font を ListViewFont プロパティに設定した時

    OwnerDrawfalse なら例外には遭遇しないのが不思議。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

namespace Demo
{

public partial class MainForm : Form
{

#region Fields

private readonly PrivateFontCollection _PrivateFontCollection = new PrivateFontCollection();

#endregion

#region Constructors

public MainForm()
{
InitializeComponent();

this.listView1.Columns.Add("Column1", 100);
this.listView1.Items.Add(new ListViewItem
{
Text = "1",
SubItems = { "2" }
});

this._PrivateFontCollection.AddFontFile("NotoSans-Regular.ttf");
var fontFamily = this._PrivateFontCollection.Families[0];
this.listView1.Font = new Font(fontFamily, 10f);
this.listView1.OwnerDraw = true;
}

#endregion

}

}

AddMemoryFont を使って追加した Open Type フォントやシステムに追加してある Open Type フォントを使った時はこの現象発生しない。
AddFontFile説明 を見ると

Windows Forms applications support TrueType fonts and have limited support for OpenType fonts. If you try to use a font that is not supported, such as an unsupported OpenType font or a Bitmap font, an exception will occur.

とあるので、この現象のことを指していると思われる。