3.3 フォントファミリ
3.3.1 利用可能なフォントを取得する
フォントファミリ、つまりフォント名を指定して Font オブジェクトを生成することができましたが、コンピュータにインストールされているフォントはアプリケーションを実行するコンピュータによって異なります。フォントはシステムからアンインストールすることができるので、アプリケーションのテスト環境では正しく動いたとしても、別のコンピュータではフォントがインストールされていない可能性があるのです。もし、コンピュータに指定したフォントがインストールされていなければ、Font コンストラクタはデフォルトのフォントを利用します。
テキストエディタなどのアプリケーションでは、多くの場合はユーザーにフォントを選択させますが、ゲームのようなアプリケーションの場合は演出を目的とするために常に固定のフォントを使いたいと考えるかもしれません。もっとも安全なフォントは Arial、Times New Roman、Courier New だと思われますが、これ以外で、特に標準でインストールされないような珍しいフォントを指定する場合は注意が必要です。
Font クラスのコンストラクタでは文字列からフォントファミリを選択することができましたが、フォントファミリは System.Drawing.FontFamily クラスで定義することができます。
System.Object System.MarshalByRefObject System.Drawing.FontFamily
public sealed class FontFamily : MarshalByRefObject, IDisposable
FontFamily オブジェクトを取得すれば、フォントのより詳細な情報を取得することができます。また、このクラスの static なメンバを利用することで、確実にフォントファミリオブジェクトを取得することができます。
FontFamily クラスのコンストラクタでは、文字列を指定してオブジェクトを作ることができます。
public FontFamily(string name)
name にはフォントファミリの名前を文字列で指定します。これは Font コンストラクタで指定したフォントファミリと同じものです。例えば、次のコード
Font font = new Font(strFamilyName, 20);
は、次のように記述することもできます。
Font font = new Font(new FontFamily(strFamilyName), 20);
これらのコードは同じ結果となるでしょう。
しかし、FontFamily クラスは、フォント名を指定してコンストラクタからインスタンスを生成する以外に、デフォルトで用意されている汎用フォントを static プロパティから提供しています。汎用 Monospace フォントは GenericMonospace プロパティ、汎用 SansSerif フォントは GenericSansSerif プロパティ、汎用 Serif フォントは GenericSerif プロパティから取得できます。
public static FontFamily GenericMonospace { get; }
public static FontFamily GenericSansSerif { get; }
public static FontFamily GenericSerif { get; }
これらを使えば、文字列で指定する不安定な入力を避けることができるため、タイプミスなどによる問題を避けることができます。
アプリケーションを実行している環境にインストールされているフォントを動的に取得するには FontFamily クラスの GetFamilies() メソッドを使うか、または Families プロパティを使います。
public static FontFamily[] GetFamilies(Graphics graphics);
public static FontFamily[] Families {get;}
Families プロパティは、システムにインストールされているフォントに対応した FontFamily オブジェクトの配列を提供します。GetFamilies() メソッドも同様ですが、この場合は graphics パラメータに指定した Graphics オブジェクトのグラフィックスコンテキストで利用可能な FontFamily の配列を返します。多くの場合は Families と同じ結果となるはずですが、例えば画面に印字できないフォントを持つ、特別な出力デバイスを参照する Graphics オブジェクトを渡した場合は、専用のフォントファミリを返す可能性があります。
FontFamily オブジェクトからフォントファミリの名前を取得するには Name プロパティを使います。
public string Name { get; }
システムで利用可能なフォントファミリの配列を取得して、Name プロパティから名前の一覧を表示させるということができます。
using System.Drawing; using System.Windows.Forms; public class Test : Form { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Brush brush = new SolidBrush(Color.Black); FontFamily[] families = FontFamily.Families; string text = ""; for(int i = 0 ; i < families.Length ; i++) { text += families[i].Name + ", "; } Rectangle rect = new Rectangle(0, 0, Width, Height); Font font = new Font(FontFamily.GenericSerif, 10); e.Graphics.DrawString(text, font, brush, rect); } static void Main() { Application.Run(new Test()); } }
コード1は、アプリケーションを実行している環境で利用可能なフォントファミリを列挙するプログラムです。実行結果は、システムにインストールされているフォントによって異なるでしょう。また、テキストを描画する Font オブジェクトの生成に FontFamily クラスの GenericSerif プロパティを利用しているところにも注目してください。