Newer
Older
TIASShot / TIASshot / UI / Form1.MemMonitor.cs
#if MEMMONITOR
using System.Windows.Forms;

namespace TIASshot {
    public partial class Form1 {

        private MemoryMonitorForm _memoryMonitorForm;

        // F9 で ON/OFF をトグルする副モニタ計測用の一時抑制フラグ。
        // true の間は ShowImage が副モニタへのフレーム給餌(コピー生成・UpdateImage 呼び出し)を止める。
        private bool _subMonitorSuppressed = false;

        /// <summary>
        /// メモリ観測ウィンドウを非モーダルで開く(MEMMONITOR 限定)。
        /// 既に開いている場合は前面化する。
        /// Shown イベントから呼び出すことでメインフォームの最終位置を確定させてから配置する。
        /// </summary>
        private void ShowMemoryMonitor() {
            if (_memoryMonitorForm != null && !_memoryMonitorForm.IsDisposed) {
                _memoryMonitorForm.BringToFront();
                return;
            }

            _memoryMonitorForm = new MemoryMonitorForm();

            // 画面録画用の初期配置: 本体(左)と観測窓(右)を作業領域いっぱいに
            // 横並び・上端揃え・同じ高さで置く。本体は左上に寄せ,観測窓は右隣の残り幅を占める。
            var wa = Screen.FromControl(this).WorkingArea;
            const int gap = 8;

            this.StartPosition = FormStartPosition.Manual;
            this.Location = new System.Drawing.Point(wa.Left, wa.Top);

            // 観測窓の左端を本体側へ少し食い込ませて左方向にわずかに拡大する
            // (録画時にグラフ領域をもう少し広く見せるため)。
            const int leftExtend = 80;
            int monX = this.Right + gap - leftExtend;
            int monWidth = wa.Right - monX;
            if (monWidth < 480) monWidth = 480; // 極端に狭い環境での最小幅ガード

            _memoryMonitorForm.StartPosition = FormStartPosition.Manual;
            _memoryMonitorForm.Location = new System.Drawing.Point(monX, wa.Top);
            _memoryMonitorForm.Size = new System.Drawing.Size(monWidth, this.Height);

            _memoryMonitorForm.Show(this);
        }

        /// <summary>
        /// 副モニタへのプレビュー給餌を ON/OFF トグルする(MEMMONITOR 限定・計測用)。
        /// F9 キーで Form1・MemoryMonitorForm のどちらからでも呼び出せる。
        /// 副ディスプレイが存在しない環境(_previewMonitor.IsShown が false)では何もしない。
        /// </summary>
        public void ToggleSubMonitorProfiling() {
            if (_previewMonitor == null || !_previewMonitor.IsShown) return; // 副ディスプレイが無い環境では何もしない
            _subMonitorSuppressed = !_subMonitorSuppressed;
            if (_subMonitorSuppressed) {
                _previewMonitor.Hide();
                PreviewProfiler.MarkEvent("SUB_OFF");
            } else {
                _previewMonitor.Show();
                PreviewProfiler.MarkEvent("SUB_ON");
            }
        }

        /// <summary>
        /// F9 キーで副モニタ給餌をトグルする(MEMMONITOR 限定)。
        /// Form1_Load で KeyPreview = true を設定した上で KeyDown に接続する。
        /// </summary>
        private void Form1_MemMonitor_KeyDown(object sender, KeyEventArgs e) {
            if (e.KeyCode == Keys.F9) {
                ToggleSubMonitorProfiling();
                e.Handled = true;
            }
        }
    }
}
#endif