# 画面設計書 9-Main Menu Bar

## 概要

フルスクリーン対応のメインメニューバーのサンプル実装の設計書である。アプリケーションのトップレベルメニューとして使用されるメニューバーの基本構造を示す。

### 本画面の処理概要

Main Menu Barは、BeginMainMenuBar()を使用してアプリケーションのメインビューポート上部に表示されるフルスクリーン幅のメニューバーのサンプルである。

**業務上の目的・背景**：多くのデスクトップアプリケーションでは、ウィンドウ上部にメインメニューバー（File、Edit等）を配置する。このサンプルは、ImGuiでそのようなメニューバーを実装する方法を示している。BeginMainMenuBar()は内部でウィンドウを作成し、メニューバーサイズに合わせて配置する。

**画面へのアクセス方法**：
1. Demo WindowのメニューバーからExamples→「Main Menu Bar」を選択
2. コード内で直接`ShowExampleAppMainMenuBar()`を呼び出す

**主要な操作・処理内容**：
1. Fileメニューからファイル操作（New、Open、Save等）を選択
2. Editメニューから編集操作（Undo、Redo、Cut、Copy、Paste）を選択

**画面遷移**：
- 遷移元：Demo Window（Examples Menu）
- 遷移先：なし（メニュー選択による機能実行のみ）

**権限による表示制御**：なし

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 152 | BeginMainMenuBar | 主機能 | フルスクリーンメニューバーの開始 |
| 153 | EndMainMenuBar | 主機能 | フルスクリーンメニューバーの終了 |
| 154 | BeginMenu | 主機能 | サブメニューの開始 |
| 155 | EndMenu | 主機能 | サブメニューの終了 |
| 156 | MenuItem | 主機能 | メニューアイテムの作成 |
| 72 | Separator | 補助機能 | メニュー内のセパレータ |

## 画面種別

ナビゲーション/メニュー

## URL/ルーティング

N/A（Immediate Mode GUIのため、URLやルーティングの概念は適用されない）

## 入出力項目

なし（パラメータを取らない関数）

## 表示項目

| 項目名 | 説明 |
|--------|------|
| Fileメニュー | ファイル操作のサブメニュー（New、Open、Open Recent、Save等） |
| Editメニュー | 編集操作のサブメニュー（Undo、Redo、Cut、Copy、Paste） |

### Fileメニュー内容

| 項目名 | ショートカット | 説明 |
|--------|---------------|------|
| (demo menu) | - | デモメニュー表示（無効） |
| New | - | 新規作成 |
| Open | Ctrl+O | 開く |
| Open Recent | - | 最近開いたファイル（サブメニュー） |
| Save | Ctrl+S | 保存 |
| Save As.. | - | 名前を付けて保存 |
| Options | - | オプション（サブメニュー） |
| (separator) | - | セパレータ |
| Colors | - | カラー選択（サブメニュー） |
| Disabled | - | 無効化された項目 |
| Checked | - | チェック状態の項目 |
| Quit | - | 終了 |

### Editメニュー内容

| 項目名 | ショートカット | 説明 |
|--------|---------------|------|
| Undo | Ctrl+Z | 元に戻す |
| Redo | Ctrl+Y | やり直し（無効） |
| (separator) | - | セパレータ |
| Cut | Ctrl+X | 切り取り |
| Copy | Ctrl+C | コピー |
| Paste | Ctrl+V | 貼り付け |

## イベント仕様

### 1-メニューアイテム選択

MenuItemが選択されると、対応する処理が実行される。このサンプルでは具体的な処理は実装されていない（空の処理ブロック）。

### 2-サブメニュー展開

BeginMenu()で作成されたメニュー項目にホバーすると、サブメニューが展開される。

### 3-チェック項目トグル

Checkedメニュー項目を選択すると、チェック状態がトグルされる。

## データベース更新仕様

N/A（Dear ImGuiはUIライブラリであり、データベース操作は行わない）

## メッセージ仕様

N/A

## 例外処理

なし

## 備考

- BeginMainMenuBar()は内部でBegin()を呼び出し、メニューバー用のウィンドウを作成する
- BeginMenuBar()との違い：BeginMenuBar()は既存ウィンドウ内にメニューバーを作成するが、BeginMainMenuBar()はビューポート上部に独立したメニューバーを作成する
- ShowExampleMenuFile()は再帰的に呼び出し可能な設計（Recurse..メニュー）
- IMGUI_DISABLE_DEMO_WINDOWSマクロが定義されている場合、この関数は利用不可

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

ShowExampleAppMainMenuBar関数がメインメニューバーの描画処理のエントリーポイント。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | ShowExampleAppMainMenuBar()関数（行8736以降）がエントリーポイント |

**主要処理フロー**:
1. **行8738**: BeginMainMenuBar()でメニューバー開始
2. **行8740-8744**: Fileメニュー（ShowExampleMenuFile()を呼び出し）
3. **行8745-8754**: Editメニュー
4. **行8755**: EndMainMenuBar()でメニューバー終了

#### Step 2: ShowExampleMenuFile関数を理解する

Fileメニューの内容を生成するヘルパー関数。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_demo.cpp | `imgui_demo.cpp` | ShowExampleMenuFile()関数（行8761以降） |

**主要処理フロー**:
1. **行8764-8766**: New、Openメニューアイテム
2. **行8767-8781**: Open Recentサブメニュー（再帰呼び出しあり）
3. **行8782-8788**: Save、Save Asメニューアイテム
4. **行8789-8834**: Options、Colors、その他のサブメニュー

### プログラム呼び出し階層図

```
ShowExampleAppMainMenuBar()
    |
    +-- ImGui::BeginMainMenuBar()
    |       |
    |       +-- ImGui::BeginMenu("File")
    |       |       +-- ShowExampleMenuFile()
    |       |       |       +-- ImGui::MenuItem("(demo menu)", ...)
    |       |       |       +-- ImGui::MenuItem("New")
    |       |       |       +-- ImGui::MenuItem("Open", "Ctrl+O")
    |       |       |       +-- ImGui::BeginMenu("Open Recent")
    |       |       |       |       +-- ImGui::MenuItem(...)
    |       |       |       |       +-- ImGui::BeginMenu("More..")
    |       |       |       |       |       +-- ShowExampleMenuFile() [再帰]
    |       |       |       |       +-- ImGui::EndMenu()
    |       |       |       +-- ImGui::EndMenu()
    |       |       |       +-- ImGui::MenuItem("Save", "Ctrl+S")
    |       |       |       +-- ImGui::MenuItem("Save As..")
    |       |       |       +-- ImGui::Separator()
    |       |       |       +-- ImGui::BeginMenu("Options")
    |       |       |       +-- ImGui::BeginMenu("Colors")
    |       |       |       +-- ImGui::MenuItem("Checked", ..., &selected)
    |       |       |       +-- ImGui::MenuItem("Quit")
    |       |       +-- ImGui::EndMenu()
    |       |
    |       +-- ImGui::BeginMenu("Edit")
    |       |       +-- ImGui::MenuItem("Undo", "Ctrl+Z")
    |       |       +-- ImGui::MenuItem("Redo", "Ctrl+Y", false, false)
    |       |       +-- ImGui::Separator()
    |       |       +-- ImGui::MenuItem("Cut", "Ctrl+X")
    |       |       +-- ImGui::MenuItem("Copy", "Ctrl+C")
    |       |       +-- ImGui::MenuItem("Paste", "Ctrl+V")
    |       +-- ImGui::EndMenu()
    |
    +-- ImGui::EndMainMenuBar()
```

### データフロー図

```
[入力]                        [処理]                         [出力]

(なし)            ─────────▶ ShowExampleAppMainMenuBar() ──▶  メニューバー描画
                                  |
static bool selected ◀────▶      |  ◀──── Checked状態
                                  |
                                  ▼
                           メニュー選択イベント
                           (MenuItem戻り値)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ShowExampleAppMainMenuBar()の実装 |
| imgui.h | `imgui.h` | ヘッダー | BeginMainMenuBar()等のAPI宣言 |
