マスタ画面フォント統一実装手順書.md

# マスタ画面フォント統一実装手順書

## 概要
すべてのマスタ画面のフォントをHG丸ゴシックM-PROに統一します。画面要素ごとに適切なフォントサイズとスタイルを設定します。

## フォント設定仕様

### 設定内容
1. **画面のタイトル**(例:添付ファイル「定期送信」など)
   - フォント:HG丸ゴシックM-PRO
   - サイズ:22pt
   - スタイル:Bold

2. **各項目**(例:テキストボックス、グリッドなど)
   - フォント:HG丸ゴシックM-PRO
   - サイズ:10pt
   - スタイル:Regular

3. **各項目に付随するラベル**(例:添付ファイルの「パターン名称」など)
   - フォント:HG丸ゴシックM-PRO
   - サイズ:12pt
   - スタイル:Bold

4. **ボタン**(例:戻るボタン、新規作成ボタンなど)
   - フォント:HG丸ゴシックM-PRO
   - サイズ:18pt
   - スタイル:Regular

### 対象外
- メニュー画面のフォントは変更しない

## 対象画面とファイル

### マスタ検索画面
1. **顧客マスタ画面**
   - M_CustomerMaster.cs
   - M_CustomerMaster.Designer.cs

2. **送信パターンマスタ画面**
   - M_SendPatternMaster.cs
   - M_SendPatternMaster.Designer.cs

3. **送信者情報マスタ画面**
   - M_SenderMaster.cs
   - M_SenderMaster.Designer.cs

### マスタ個別編集画面
1. **顧客マスタ個別編集画面**
   - M_CustomerMasterIndividualEdit.cs
   - M_CustomerMasterIndividualEdit.Designer.cs

2. **送信パターンマスタ個別編集画面**
   - M_SendPatternIndividualEdit.cs
   - M_SendPatternIndividualEdit.Designer.cs

### 関連ユーザーコントロール
各画面で使用されているユーザーコントロール内のフォントも統一する必要があります。

## 実装方針

### 方針1: Designerファイルでの直接設定(非推奨)
Designerファイルを直接編集する方法は、Visual Studioのデザイナーで上書きされる可能性があるため推奨しません。

### 方針2: コード内での動的設定(推奨)
各フォームのコンストラクタまたはLoadイベントでフォントを設定します。

### 方針3: 基底クラスの作成(最適解)
すべてのマスタ画面の基底クラスを作成し、フォント設定を一元管理します。

## 実装手順(方針2: コード内での動的設定)

### ステップ1: フォント設定ヘルパークラスの作成

#### 1.1 FontSettingHelper.csの作成
```csharp
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>
        public static Font GetTitleFont()
        {
            return new Font(FONT_NAME, TITLE_FONT_SIZE, FontStyle.Bold);
        }
        
        /// <summary>
        /// ラベルのフォントを設定
        /// </summary>
        public static Font GetLabelFont()
        {
            return new Font(FONT_NAME, LABEL_FONT_SIZE, FontStyle.Bold);
        }
        
        /// <summary>
        /// 項目(テキストボックス、グリッド等)のフォントを設定
        /// </summary>
        public static Font GetItemFont()
        {
            return new Font(FONT_NAME, ITEM_FONT_SIZE, FontStyle.Regular);
        }
        
        /// <summary>
        /// ボタンのフォントを設定
        /// </summary>
        public static Font GetButtonFont()
        {
            return new Font(FONT_NAME, BUTTON_FONT_SIZE, FontStyle.Regular);
        }
        
        /// <summary>
        /// コントロールとその子コントロールにフォントを適用
        /// </summary>
        public static void ApplyFontsToControl(Control control)
        {
            // コントロールの種類に応じてフォントを設定
            if (control is Button)
            {
                control.Font = GetButtonFont();
            }
            else if (control is Label)
            {
                // タイトルラベルかどうかを判定(例:サイズや名前で判定)
                if (control.Name.Contains("Title") || control.Font.Size > 15)
                {
                    control.Font = GetTitleFont();
                }
                else
                {
                    control.Font = GetLabelFont();
                }
            }
            else if (control is TextBox || control is ComboBox || control is DataGridView || control is CheckBox || control is RadioButton)
            {
                control.Font = GetItemFont();
            }
            
            // 子コントロールに対して再帰的に適用
            foreach (Control child in control.Controls)
            {
                ApplyFontsToControl(child);
            }
        }
        
        /// <summary>
        /// フォーム全体にフォントを適用
        /// </summary>
        public static void ApplyFontsToForm(Form form)
        {
            // フォーム自体のフォントを設定
            form.Font = GetItemFont();
            
            // すべてのコントロールに適用
            ApplyFontsToControl(form);
        }
    }
}
```

### ステップ2: 各マスタ画面への適用

#### 2.1 M_CustomerMaster.csの修正
```csharp
private void M_CustomerMaster_Load(object sender, EventArgs e)
{
    // 既存のコード...
    
    // フォントの統一設定を適用
    FontSettingHelper.ApplyFontsToForm(this);
    
    // ユーザーコントロールにも適用
    FontSettingHelper.ApplyFontsToControl(_searchBoxControl);
    FontSettingHelper.ApplyFontsToControl(_customerDgvControl);
    FontSettingHelper.ApplyFontsToControl(_btnControl);
}
```

#### 2.2 他のマスタ画面への適用
同様の方法で、以下の画面にも適用します:
- M_SendPatternMaster.cs
- M_SenderMaster.cs
- M_CustomerMasterIndividualEdit.cs
- M_SendPatternIndividualEdit.cs

### ステップ3: ユーザーコントロールへの対応

各ユーザーコントロールのコンストラクタまたはLoadイベントで、内部のコントロールにフォントを適用します。

```csharp
public SearchBoxControl()
{
    InitializeComponent();
    
    // デザインモードでない場合のみ実行
    if (!DesignMode)
    {
        // フォントの統一設定を適用
        FontSettingHelper.ApplyFontsToControl(this);
    }
}
```

## テストシナリオ

### シナリオ1: フォントの表示確認
1. 各マスタ画面を開く
2. 以下の要素のフォントを確認:
   - タイトル部分:HG丸ゴシックM-PRO 22pt Bold
   - ラベル:HG丸ゴシックM-PRO 12pt Bold
   - テキストボックス、グリッド:HG丸ゴシックM-PRO 10pt Regular
   - ボタン:HG丸ゴシックM-PRO 18pt Regular

### シナリオ2: 文字の表示確認
1. 日本語文字が正しく表示されることを確認
2. 文字が切れたり、重なったりしていないことを確認

### シナリオ3: レイアウトの確認
1. フォント変更によりレイアウトが崩れていないことを確認
2. ボタンやテキストボックスのサイズが適切であることを確認

## 実装の注意点

### 1. フォントの存在確認
HG丸ゴシックM-PROがシステムにインストールされていない場合のフォールバック処理を検討する必要があります。

```csharp
private static bool IsFontInstalled(string fontName)
{
    using (var font = new Font(fontName, 10))
    {
        return font.Name == fontName;
    }
}
```

### 2. パフォーマンスへの配慮
- フォントオブジェクトの使い回しを検討
- 不要なフォントオブジェクトの破棄

### 3. デザイナーとの連携
Visual Studioのデザイナーでフォームを開いた際に、設定したフォントが上書きされないよう注意が必要です。

## 実装チェックリスト

### FontSettingHelper.cs
- [ ] クラスの作成
- [ ] 各フォント取得メソッドの実装
- [ ] ApplyFontsToControlメソッドの実装
- [ ] ApplyFontsToFormメソッドの実装

### 各マスタ画面
- [ ] M_CustomerMaster.csへの適用
- [ ] M_SendPatternMaster.csへの適用
- [ ] M_SenderMaster.csへの適用
- [ ] M_CustomerMasterIndividualEdit.csへの適用
- [ ] M_SendPatternIndividualEdit.csへの適用

### ユーザーコントロール
- [ ] SearchBoxControlへの適用
- [ ] CustomerDgvControlへの適用
- [ ] BtnAddMasterControlへの適用
- [ ] その他関連コントロールへの適用

### 動作確認
- [ ] 各画面でフォントが正しく表示されること
- [ ] レイアウトが崩れていないこと
- [ ] 文字が切れたり重なったりしていないこと

## 今後の拡張性

### 1. 設定ファイルからの読み込み
フォント設定を外部設定ファイル(app.config等)から読み込めるようにすることで、柔軟性が向上します。

### 2. ユーザー設定の保存
ユーザーがフォントサイズを変更できるようにし、その設定を保存する機能の追加を検討できます。

### 3. アクセシビリティ対応
視覚障害者向けに、高コントラストモードや大きなフォントサイズへの対応を検討できます。

## まとめ

この実装により、すべてのマスタ画面でフォントが統一され、一貫性のあるユーザーインターフェースが実現されます。FontSettingHelperクラスを使用することで、将来的なフォント変更も容易になります。