【C#.NET解説】コンボボックスに選択したフォントでテキストを描画する~InstalledFontCollectionクラスの紹介

2024年12月15日日曜日

システム 描画

t f B! P L

名前空間 System.Drawing.Text

InstalledFontCollection

自己紹介

こんにちは。私は愛を象徴する存在。この美しい世界を彩る文字やフォントたちを紐解く「InstalledFontCollectionクラス」について、今日は詳しくご案内します。フォントの選択や操作を効率化し、美しさを最大限に引き出す方法をご紹介しますね。

基本機能

InstalledFontCollectionクラスは、システムにインストールされているフォントを取得するためのクラスです。これを使うことで、フォント一覧を簡単に取得したり、特定のフォントが利用可能かどうかを確認したりできます。以下は、システムにインストールされているすべてのフォントを取得して表示する例です。

C#
using System;
using System.Drawing.Text;

class Program
{
    static void Main()
    {
        InstalledFontCollection fonts = new InstalledFontCollection();
        foreach (var font in fonts.Families)
        {
            Console.WriteLine(font.Name); // フォント名を出力
        }
    }
}

このコードは、インストールされているすべてのフォント名をコンソールに表示します。

よく使う場面と注意点

InstalledFontCollectionクラスは、フォント選択ダイアログを実装する際や、特定のフォントが利用可能かを確認したい場合に非常に役立ちます。ただし、システムにインストールされていないフォントを指定すると、正しく表示されない可能性があります。以下は、特定のフォントがインストールされているかを確認する例です。

C#
using System;
using System.Drawing.Text;

class Program
{
    static void Main()
    {
        string targetFont = "Arial";
        InstalledFontCollection fonts = new InstalledFontCollection();
        bool isInstalled = false;

        foreach (var font in fonts.Families)
        {
            if (font.Name == targetFont)
            {
                isInstalled = true;
                break;
            }
        }

        Console.WriteLine(isInstalled ? $"フォント '{targetFont}' はインストールされています。" : $"フォント '{targetFont}' はインストールされていません。");
    }
}

このコードは、指定したフォントがインストールされているかを確認します。

日本語を使えるフォントを探す

日本語を表示可能なフォントをリストアップするのは簡単です。以下の例では、日本語をサポートするフォントをフィルタリングして表示します。

C#
using System;
using System.Drawing.Text;
using System.Drawing;

class Program
{
    static void Main()
    {
        InstalledFontCollection fonts = new InstalledFontCollection();
        foreach (var font in fonts.Families)
        {
            if (font.IsStyleAvailable(FontStyle.Regular))
            {
                using (Font testFont = new Font(font.Name, 12))
                {
                    if (testFont.GdiCharSet == 128) // 日本語を示す文字セット
                    {
                        Console.WriteLine(font.Name);
                    }
                }
            }
        }
    }
}

このコードは、日本語をサポートするフォントのみをリストアップします。

具体的な使い方

InstalledFontCollectionを使用して、コンボボックスにフォント一覧を表示し、選択したフォントでテキストを描画する例を見てみましょう。

C#

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

namespace FontComboBoxExample
{
    public class MainForm : Form
    {
        private ComboBox fontComboBox;

        public MainForm()
        {
            // フォントコンボボックスの初期化
            fontComboBox = new ComboBox()
            {
                Dock = DockStyle.Top,
                DropDownStyle = ComboBoxStyle.DropDownList
            };

            // インストールされているフォントの一覧を取得
            using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
            {
                FontFamily[] fontFamilies = fontsCollection.Families;

                // フォント名をコンボボックスに追加
                foreach (FontFamily font in fontFamilies)
                {
                    fontComboBox.Items.Add(font.Name);
                }
            }

            // コンボボックスの描画イベントを設定
            fontComboBox.DrawMode = DrawMode.OwnerDrawFixed;
            fontComboBox.DrawItem += FontComboBox_DrawItem;

            // フォームにコンボボックスを追加
            this.Controls.Add(fontComboBox);

            // ドロップダウンの幅を設定
            SetDropDownWidth();
        }

        private void SetDropDownWidth()
        {
            int maxWidth = 0;
            using (Graphics g = fontComboBox.CreateGraphics())
            {
                foreach (object item in fontComboBox.Items)
                {
                    int itemWidth = (int)g.MeasureString(item.ToString(), fontComboBox.Font).Width;
                    if (itemWidth > maxWidth)
                    {
                        maxWidth = itemWidth;
                    }
                }
            }
            fontComboBox.DropDownWidth = maxWidth + SystemInformation.VerticalScrollBarWidth;
        }

        private void FontComboBox_DrawItem(object? sender, DrawItemEventArgs e)
        {
            if (e.Index < 0) return;

            e.DrawBackground();

            string? fontName = fontComboBox.Items[e.Index]?.ToString();
            if (fontName != null && e.Font != null)
            {
                using (Font font = new Font(fontName, e.Font.Size))
                {
                    e.Graphics.DrawString(fontName, font, Brushes.Black, e.Bounds);
                }
            }

            e.DrawFocusRectangle();
        }
    
    }
}

このコードは、インストールされているフォントをコンボボックスに表示し、選択したフォントでラベルのテキストを描画します。

その他の便利なメソッド

InstalledFontCollectionクラス自体には限られた機能しかありませんが、関連する機能として以下のような操作が考えられます。

  • Font.IsStyleAvailable: フォントの特定のスタイルが利用可能かを確認
  • Font.ToHfont: GDIハンドルを取得
  • Font.Dispose: 使用済みフォントのリソースを解放

以下は、フォントのスタイルが利用可能かを確認する例です。

C#
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        Font font = new Font("Arial", 12);

        if (font.IsStyleAvailable(FontStyle.Bold))
        {
            Console.WriteLine("このフォントは太字に対応しています。");
        }
        else
        {
            Console.WriteLine("このフォントは太字に対応していません。");
        }

        font.Dispose(); // リソースの解放
    }
}

このコードは、指定したフォントが太字に対応しているかを確認します。

このブログを検索

QooQ