Utils/FontSettingHelper.cs

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

namespace ChatworkBulkSender.Utils
{
    /// <summary>
    /// マスタ画面のフォント設定を統一するヘルパークラス
    /// </summary>
    public static class FontSettingHelper
    {
        // フォント名
        private const string FONT_NAME = "HG丸ゴシックM-PRO";
        
        // フォントサイズ
        private const float TITLE_FONT_SIZE = 22f;
        private const float LABEL_FONT_SIZE = 12f;
        private const float ITEM_FONT_SIZE = 10f;
        private const float BUTTON_FONT_SIZE = 18f;
        
        /// <summary>
        /// フォントがインストールされているかチェック
        /// </summary>
        private static bool IsFontInstalled(string fontName)
        {
            using (var font = new Font(fontName, 10))
            {
                return font.Name == fontName;
            }
        }
        
        /// <summary>
        /// 使用するフォント名を取得(フォールバック付き)
        /// </summary>
        private static string GetFontName()
        {
            if (IsFontInstalled(FONT_NAME))
            {
                return FONT_NAME;
            }
            else
            {
                // フォールバックフォント
                return "メイリオ";
            }
        }
        
        /// <summary>
        /// フォームのタイトルフォントを設定
        /// </summary>
        public static Font GetTitleFont()
        {
            return new Font(GetFontName(), TITLE_FONT_SIZE, FontStyle.Bold);
        }
        
        /// <summary>
        /// ラベルのフォントを設定
        /// </summary>
        public static Font GetLabelFont()
        {
            return new Font(GetFontName(), LABEL_FONT_SIZE, FontStyle.Bold);
        }
        
        /// <summary>
        /// 項目(テキストボックス、グリッド等)のフォントを設定
        /// </summary>
        public static Font GetItemFont()
        {
            return new Font(GetFontName(), ITEM_FONT_SIZE, FontStyle.Regular);
        }
        
        /// <summary>
        /// ボタンのフォントを設定
        /// </summary>
        public static Font GetButtonFont()
        {
            return new Font(GetFontName(), BUTTON_FONT_SIZE, FontStyle.Regular);
        }
        
        /// <summary>
        /// コントロールとその子コントロールにフォントを適用
        /// </summary>
        public static void ApplyFontsToControl(Control control)
        {
            // nullチェック
            if (control == null) return;
            
            // コントロールの種類に応じてフォントを設定
            if (control is Button)
            {
                control.Font = GetButtonFont();
            }
            else if (control is Label)
            {
                // タイトルラベルかどうかを判定(例:サイズや名前で判定)
                if (control.Name.Contains("Title") || control.Name.Contains("title") || 
                    control.Name.Contains("Header") || control.Name.Contains("header") ||
                    control.Font.Size > 15)
                {
                    control.Font = GetTitleFont();
                }
                else
                {
                    control.Font = GetLabelFont();
                }
            }
            else if (control is TextBox || control is ComboBox || control is CheckBox || 
                     control is RadioButton || control is ListBox)
            {
                control.Font = GetItemFont();
            }
            else if (control is DataGridView)
            {
                var dgv = control as DataGridView;
                dgv.Font = GetItemFont();
                // ヘッダーのフォントも設定
                dgv.ColumnHeadersDefaultCellStyle.Font = GetLabelFont();
            }
            else if (control is GroupBox)
            {
                control.Font = GetLabelFont();
            }
            
            // 子コントロールに対して再帰的に適用
            foreach (Control child in control.Controls)
            {
                ApplyFontsToControl(child);
            }
        }
        
        /// <summary>
        /// フォーム全体にフォントを適用
        /// </summary>
        public static void ApplyFontsToForm(Form form)
        {
            // nullチェック
            if (form == null) return;
            
            // フォーム自体のフォントを設定
            form.Font = GetItemFont();
            
            // すべてのコントロールに適用
            ApplyFontsToControl(form);
        }
    }
}