public void 描画する()
        {
            this._システム情報.VPSをカウントする();

            var dc = Global.既定のD2D1DeviceContext;

            dc.Transform = Global.拡大行列DPXtoPX;

            this._舞台画像.進行描画する(dc);
            this._パネルリスト.進行描画する(dc, 613f, 0f);

            switch (this.現在のフェーズ)
            {
            case フェーズ.フェードイン:
                this._パネルリスト.フェードインを開始する();
                this.現在のフェーズ = フェーズ.表示;
                break;

            case フェーズ.入力割り当て:
                #region " *** "
                //----------------
            {
                var 完了通知 = new ManualResetEvent(false);

                Global.AppForm.BeginInvoke(new Action(() => {
                        using var dlg = new 入力割り当てダイアログ();

                        Cursor.Show();      // いったんマウスカーソル表示

                        dlg.表示する();

                        if (Global.AppForm.ScreenMode.IsFullscreenMode)
                        {
                            Cursor.Hide();      // 全画面ならマウスカーソルを消す。
                        }
                        完了通知.Set();
                    }));

                完了通知.WaitOne();

                this._パネルリスト.フェードインを開始する();
                this.現在のフェーズ = フェーズ.表示;
            }
                //----------------
                #endregion
                break;

            case フェーズ.曲読み込みフォルダ割り当て:
                #region " *** "
                //----------------
            {
                var 完了通知 = new ManualResetEvent(false);

                Global.AppForm.BeginInvoke(new Action(() => {
                        using var dlg = new 曲読み込みフォルダ割り当てダイアログ(Global.App.システム設定.曲検索フォルダ);

                        Cursor.Show();      // いったんマウスカーソル表示

                        if (dlg.ShowDialog() == DialogResult.OK &&
                            dlg.新しい曲検索フォルダリストを取得する(out List <VariablePath> 新フォルダリスト))
                        {
                            // 曲検索フォルダを新しいリストに更新。
                            Global.App.システム設定.曲検索フォルダ.Clear();
                            Global.App.システム設定.曲検索フォルダ.AddRange(新フォルダリスト);
                            Global.App.システム設定.保存する();

                            // 再起動へ。
                            this.現在のフェーズ = フェーズ.再起動;
                        }
                        else
                        {
                            this.現在のフェーズ = フェーズ.表示;
                        }

                        if (Global.AppForm.ScreenMode.IsFullscreenMode)
                        {
                            Cursor.Hide();      // 全画面ならマウスカーソルを消す。
                        }
                        完了通知.Set();
                    }));

                完了通知.WaitOne();
            }
                //----------------
                #endregion
                break;

            case フェーズ.再起動:
                Global.AppForm.BeginInvoke(new Action(() => {
                    Global.AppForm.再起動する();
                }));
                this.現在のフェーズ = フェーズ.再起動待ち;
                break;

            case フェーズ.再起動待ち:
                break;

            case フェーズ.フェードアウト:
                Global.App.アイキャッチ管理.現在のアイキャッチ.進行描画する(dc);
                if (Global.App.アイキャッチ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.フェーズ.クローズ完了)
                {
                    this.現在のフェーズ = フェーズ.完了;
                }
                break;
            }

            this._システム情報.描画する(dc);
        }
        // 進行と描画


        public void 進行する()
        {
            this._システム情報.FPSをカウントしプロパティを更新する();

            var 入力 = Global.App.ドラム入力;

            入力.すべての入力デバイスをポーリングする();

            switch (this.現在のフェーズ)
            {
            case フェーズ.フェードイン:
            {
                #region " フェードインを開始して表示フェーズへ。"
                //----------------
                if (this._フェードインフェーズ完了)
                {
                    // 表示フェーズへ。
                    this.現在のフェーズ = フェーズ.表示;
                }
                //----------------
                #endregion

                break;
            }

            case フェーズ.表示:
            {
                #region " 入力処理。"
                //----------------
                if (入力.キャンセルキーが入力された())
                {
                    #region " キャンセル "
                    //----------------
                    if (this._パネルリスト.現在のパネルフォルダ.親パネル is null)
                    {
                        #region " (A) 親ツリーがない → ステージをフェードアウトフェーズへ。"
                        //----------------
                        Global.App.システムサウンド.再生する(システムサウンド種別.取消音);

                        this._パネルリスト.フェードアウトを開始する();
                        Global.App.アイキャッチ管理.アイキャッチを選択しクローズする(nameof(半回転黒フェード));

                        this.現在のフェーズ = フェーズ.フェードアウト;
                        //----------------
                        #endregion
                    }
                    else
                    {
                        #region " (B) 親ツリーがある → 親ツリーへ戻る。"
                        //----------------
                        Global.App.システムサウンド.再生する(システムサウンド種別.取消音);

                        this._パネルリスト.親のパネルを選択する();
                        this._パネルリスト.フェードインを開始する();
                        //----------------
                        #endregion
                    }
                    //----------------
                    #endregion
                }
                else if (入力.移動キーが入力された())
                {
                    #region " 上移動 "
                    //----------------
                    Global.App.システムサウンド.再生する(システムサウンド種別.カーソル移動音);

                    this._パネルリスト.前のパネルを選択する();
                    //----------------
                    #endregion
                }
                else if (入力.移動キーが入力された())
                {
                    #region " 下移動 "
                    //----------------
                    Global.App.システムサウンド.再生する(システムサウンド種別.カーソル移動音);

                    this._パネルリスト.次のパネルを選択する();
                    //----------------
                    #endregion
                }
                else if (入力.左移動キーが入力された())
                {
                    #region " 左移動 "
                    //----------------
                    Global.App.システムサウンド.再生する(システムサウンド種別.更音);

                    this._パネルリスト.現在選択中のパネル !.左移動キーが入力された();
                    //----------------
                    #endregion
                }
                else if (入力.右移動キーが入力された())
                {
                    #region " 右移動 "
                    //----------------
                    Global.App.システムサウンド.再生する(システムサウンド種別.更音);

                    this._パネルリスト.現在選択中のパネル !.右移動キーが入力された();
                    //----------------
                    #endregion
                }
                else if (入力.確定キーが入力された())
                {
                    #region " 確定 "
                    //----------------
                    Global.App.システムサウンド.再生する(システムサウンド種別.更音);

                    this._パネルリスト.現在選択中のパネル !.確定キーが入力された();
                    //----------------
                    #endregion
                }
                //----------------
                #endregion

                break;
            }

            case フェーズ.入力割り当て:
            {
                #region " 入力割り当てダイアログを表示する。"
                //----------------
                // 入力割り当てダイアログを表示。
                var asycnResult = Global.App.BeginInvoke(new Action(() => {
                        using var dlg = new 入力割り当てダイアログ();

                        Cursor.Show();  // いったんマウスカーソル表示

                        dlg.表示する();

                        if (Global.App.ScreenMode.IsFullscreenMode)
                        {
                            Cursor.Hide();  // 全画面ならマウスカーソルを消す。
                        }
                    }));

                // 入力割り当てダイアログが閉じられるのを待つ。
                asycnResult.AsyncWaitHandle.WaitOne();

                // 閉じられたら表示フェーズへ。
                this._パネルリスト.フェードインを開始する();
                this.現在のフェーズ = フェーズ.表示;
                //----------------
                #endregion

                break;
            }

            case フェーズ.曲読み込みフォルダ割り当て:
            {
                #region " 曲読み込みフォルダ割り当てダイアログを表示する。"
                //----------------
                var asyncResult = Global.App.BeginInvoke(new Action(() => {
                        using var dlg = new 曲読み込みフォルダ割り当てダイアログ(Global.App.システム設定.曲検索フォルダ);

                        Cursor.Show();  // いったんマウスカーソル表示

                        if (dlg.ShowDialog() == DialogResult.OK &&
                            dlg.新しい曲検索フォルダリストを取得する(out List <VariablePath> 新フォルダリスト))
                        {
                            // 曲検索フォルダを新しいリストに更新。
                            Global.App.システム設定.曲検索フォルダ.Clear();
                            Global.App.システム設定.曲検索フォルダ.AddRange(新フォルダリスト);
                            Global.App.システム設定.保存する();

                            // 再起動へ。
                            this._再起動が必要 = true;
                        }
                        else
                        {
                            this._再起動が必要 = false;
                        }

                        if (Global.App.ScreenMode.IsFullscreenMode)
                        {
                            Cursor.Hide();  // 全画面ならマウスカーソルを消す。
                        }
                    }));

                // 曲読み込みフォルダ割り当てダイアログが閉じられるのを待つ。
                asyncResult.AsyncWaitHandle.WaitOne();

                // 閉じられたら次のフェーズへ。
                this.現在のフェーズ = (this._再起動が必要) ? フェーズ.再起動 : フェーズ.表示;
                //----------------
                #endregion

                break;
            }

            case フェーズ.再起動:
            {
                #region " UIスレッドで再起動を実行する。"
                //----------------
                Global.App.BeginInvoke(new Action(() => {
                        Global.App.再起動する();     // UIスレッドで実行
                    }));

                // 次のフェーズへ。
                this.現在のフェーズ = フェーズ.再起動待ち;
                //----------------
                #endregion

                break;
            }

            case フェーズ.フェードアウト:
            {
                #region " フェードアウトが完了したら次のフェーズへ。"
                //----------------
                if (Global.App.アイキャッチ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.フェーズ.クローズ完了)
                {
                    this.現在のフェーズ = フェーズ.完了;
                }
                //----------------
                #endregion

                break;
            }

            case フェーズ.再起動待ち:
            case フェーズ.完了:
            {
                #region " 遷移終了。Appによるステージ遷移を待つ。"
                //----------------
                //----------------
                #endregion

                break;
            }
            }

            #region " 画面モードが外部(F11キーなど)で変更されている場合には、それを「画面モード」パネルにも反映する。"
            //----------------
            {
                var 画面モードパネル = this._パネルリスト.パネルツリーのルートノード.子パネルリスト
                               .Find((p) => (p.パネル名 == Properties.Resources.TXT_画面モード))
                               as パネル_文字列リスト;

                if (画面モードパネル is null)   // 念のため
                {
                    throw new Exception("「画面モード」パネルが存在していません。");
                }

                int システム設定上の現在の画面モード = (Global.App.システム設定.全画面モードである) ? 1 : 0;   // 0:ウィンドウ, 1:全画面

                if (画面モードパネル.現在選択されている選択肢の番号 != システム設定上の現在の画面モード)
                {
                    画面モードパネル.現在選択されている選択肢の番号 = システム設定上の現在の画面モード;
                }
            }
            //----------------
            #endregion
        }