///////////////////////////////
// Cells.cs
// Copyright (c) 2026 by ysama
///////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;						//Path、FileStream使用の為
using System.Text;						//Encording使用の為
using System.Reflection;				//Assembly使用の為
using System.Resources;					//リソース使用の為
using Cell_World;						//Cell_World.dll使用の為

namespace Cell
{
	public class CellGame : Form
	{
		//クラスメンバーフィールド
		Assembly myOwn = Assembly.GetEntryAssembly();
		string FileName;							//地形ファイル（*.trn）パス名
		private int GameHours;						//Cellゲーム内の経過時間（Goes_Aroundの回数で増加する）
		//クラスメンバーコントロール
		MenuStrip menuStrip;						//メニュー
		ToolStrip toolStrip;						//ツールバー
		ToolStripButton[] tsButton;					//ツールバーボタン
		StatusStrip statusStrip;					//ステータスバー
		ToolStripStatusLabel[] tssl;				//ステータスバーラベル
		World world;								//Cell_World.dllのWorldクラスインスタンス
		//描画用タイマー
		Timer GameTimer;
		//クラス内で参照されるメニューアイテム
		ToolStripMenuItem miOpen;		//「データを開く」メニューアイテム
		ToolStripMenuItem miStart;		//「ゲーム開始」メニューアイテム
		ToolStripMenuItem miCellInfo;	//「セルの情報」メニューアイテム
		ToolStripMenuItem miEnd;		//「ゲーム終了」メニューアイテム

		[STAThread]
		public static void Main()					//エントリーポイント
		{
			Application.Run(new CellGame());
		}

		public CellGame()							//コンストラクター
		{
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコン
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		//サイズ変更不可とする
			this.MaximizeBox = false;								//最大化ボタン不可
			this.StartPosition = FormStartPosition.CenterScreen;	//画面中央表示
			//メニューバー、ツールバー、ステータスバーの高さ（71）を追加してサイズを設定
			this.ClientSize = new Size(1280, 640 + 71);	//80 x 40の16 x 16ビットマップサイズ
			this.Text = "Cells for C#";
			//起動時処理
			this.Load += CellGame_Load;
			//地形ファイル名の既定値（"world_terrain.trn"）を設定する
			FileName = Path.GetDirectoryName(myOwn.Location) + "\\world_terrain.trn";
		}

		private void CellGame_Load(object sender, EventArgs e)
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//ツールバーとステータスバーの設定
			MakeBars();
			//メニューの作成（MenuStripはコントロールであり、上からの並びはDock投入のFILO順となる）
			MakeMenu();
			//メニュー・ツールバーボタンの状態設定
			SetStatus(false);
			//フォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();
			//Logフォールダーを作成（初回のみ）
			Directory.CreateDirectory(".\\Log");
			//描画用World（PictureBoxから派生）インスタンス
			world = new World();
			world.Location = new Point(0, toolStrip.Height + menuStrip.Height);	//位置
			this.Controls.Add(world);
			//タイマー初期設定
			GameTimer = new Timer();
			GameTimer.Interval = 100;	//設定値100/1000秒（最小値は事実上15程度）
			GameTimer.Tick += OnTimer;
		}

		//メニューの作成
		private void MakeMenu()
		{
			//メインメニュー作成
			menuStrip = new MenuStrip();
			menuStrip.SuspendLayout();
			//メインメニューアイテム付加
			ToolStripMenuItem miFile = new ToolStripMenuItem();		//「ファイル」メニュー
			miFile.Text = "ファイル(&F)";
			menuStrip.Items.Add(miFile);
			ToolStripMenuItem miGame = new ToolStripMenuItem();		//「ゲーム」メニュー
			miGame.Text = "ゲーム(&G)";
			menuStrip.Items.Add(miGame);
			ToolStripMenuItem miHelp = new ToolStripMenuItem();		//「ヘルプ」メニュー
			miHelp.Text = "ヘルプ(&H)";
			menuStrip.Items.Add(miHelp);
			//「ファイル」メニューアイテム付加
			miOpen = new ToolStripMenuItem();						//「データを開く」メニューアイテム
			miOpen.Text = "データを開く(&O)";
			miOpen.Click += OnOpen_Click;
			miOpen.ShortcutKeys = Keys.Control | Keys.O;
			miFile.DropDownItems.Add(miOpen);
			miFile.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miExit = new ToolStripMenuItem();		//「終了」メニューアイテム
			miExit.Text = "終了(&X)";
			miExit.Click += OnExit_Click;
			miExit.ShortcutKeys = Keys.Control | Keys.X;
			miFile.DropDownItems.Add(miExit);
			//「ゲーム」メニューアイテム付加
			miStart = new ToolStripMenuItem();						//「ゲーム開始」メニューアイテム
			miStart.Text = "ゲーム開始(&S)";
			miStart.Click += OnStart_Click;
			miStart.ShortcutKeys = Keys.Control | Keys.S;
			miGame.DropDownItems.Add(miStart);
			miGame.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			miCellInfo = new ToolStripMenuItem();					//「セルの情報」メニューアイテム
			miCellInfo.Text = "セルの情報(&I)";
			miCellInfo.Click += OnInfo_Click;
			miCellInfo.ShortcutKeys = Keys.Control | Keys.I;
			miGame.DropDownItems.Add(miCellInfo);
			miGame.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			miEnd = new ToolStripMenuItem();						//「ゲーム終了」メニューアイテム
			miEnd.Text = "ゲーム終了(&E)";
			miEnd.Click += OnEnd_Click;
			miEnd.ShortcutKeys = Keys.Control | Keys.E;
			miGame.DropDownItems.Add(miEnd);
			//「ヘルプ」メニューアイテム付加
			ToolStripMenuItem miHowtoPlay = new ToolStripMenuItem();//「遊び方」メニューアイテム
			miHowtoPlay.Text = "遊び方(&P)";
			miHowtoPlay.Click += OnHowtoPlay_Click;
			miHowtoPlay.ShortcutKeys = Keys.Control | Keys.P;
			miHelp.DropDownItems.Add(miHowtoPlay);
			miGame.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miVer = new ToolStripMenuItem();		//「バージョン」メニューアイテム
			miVer.Text = "バージョン(&V)";
			miVer.Click += OnVersion_Click;
			miVer.ShortcutKeys = Keys.F2;
			miHelp.DropDownItems.Add(miVer);
			//メインメニューに設定して表示
			this.MainMenuStrip = menuStrip;
			this.Controls.Add(menuStrip);
			menuStrip.ResumeLayout(false);
			menuStrip.PerformLayout();
		}

		//ツールバーとステータスバーの作成
		private void MakeBars()
		{
			//ToolStripクラスインスタンスの生成
			this.toolStrip = new ToolStrip();
			//ツールバーのレイアウトを一時停止
			this.toolStrip.SuspendLayout();
			//ToolStripButton配列を作成
			this.tsButton = new ToolStripButton[6];
			//本プログラムの埋め込みリソースのリソースマネージャーを作成
			ResourceManager rm = new ResourceManager("Cells", myOwn);
			//ツールバービットマップの読み込み
			ImageList imgList = new ImageList();
			imgList.ImageSize = new Size(16, 15);
			imgList.Images.AddStrip((Bitmap)rm.GetObject("ToolBar"));
			imgList.TransparentColor = Color.FromArgb(0xFF, 0xFF, 0xFF);	//ToolBar.bmpの背景色

			//ToolStripButton[0]を作成
			this.tsButton[0] = new ToolStripButton();
			this.tsButton[0].Text = "データを開く";							//テキスト設定
			this.tsButton[0].Image = (Bitmap)imgList.Images[0];				//画像設定
			this.tsButton[0].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[0].Click += OnOpen_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[0]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[1]を作成
			this.tsButton[1] = new ToolStripButton();
			this.tsButton[1].Text = "Cellの終了";							//テキスト設定
			this.tsButton[1].Image = (Bitmap)imgList.Images[1];				//画像設定
			this.tsButton[1].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[1].Click += OnExit_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[1]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[2]を作成
			this.tsButton[2] = new ToolStripButton();
			this.tsButton[2].Text = "ゲーム開始";							//テキスト設定
			this.tsButton[2].Image = (Bitmap)imgList.Images[2];				//画像設定
			this.tsButton[2].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[2].Click += OnStart_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[2]);						//ボタンを追加
			//ToolStripButton[3]を作成
			this.tsButton[3] = new ToolStripButton();
			this.tsButton[3].Text = "Cellの情報";							//テキスト設定
			this.tsButton[3].Image = (Bitmap)imgList.Images[3];				//画像設定
			this.tsButton[3].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[3].Click += OnInfo_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[3]);						//ボタンを追加
			//ToolStripButton[4]を作成
			this.tsButton[4] = new ToolStripButton();
			this.tsButton[4].Text = "ゲーム終了";							//テキスト設定
			this.tsButton[4].Image = (Bitmap)imgList.Images[4];				//画像設定
			this.tsButton[4].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[4].Click += OnEnd_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[4]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[5]を作成
			this.tsButton[5] = new ToolStripButton();
			this.tsButton[5].Text = "バージョン";							//テキスト設定
			this.tsButton[5].Image = (Bitmap)imgList.Images[5];				//画像設定
			this.tsButton[5].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[5].Click += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[5]);						//ボタンを追加
			//ツールバーの設定
			this.Controls.Add(this.toolStrip);
			//ツールバーのレイアウトを再開
			this.toolStrip.ResumeLayout(false);
			this.toolStrip.PerformLayout();

			//StatusStripクラスインスタンスの生成
			this.statusStrip = new StatusStrip();
			//ステータスバーにパネルとテキストを追加
			tssl = new ToolStripStatusLabel[3];
			tssl[0] = new ToolStripStatusLabel();
			tssl[0].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[0].BorderStyle = Border3DStyle.SunkenInner;
			tssl[0].BackColor = SystemColors.Control;
			tssl[0].TextAlign = ContentAlignment.MiddleLeft;
			tssl[0].Text = "Cells for C# Ver. 2.0";
			tssl[0].AutoSize = true;
			tssl[1] = new ToolStripStatusLabel();
			tssl[1].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[1].BorderStyle = Border3DStyle.SunkenInner;
			tssl[1].BackColor = SystemColors.Control;
			tssl[1].TextAlign = ContentAlignment.MiddleLeft;
			tssl[1].Text = "（経過時間が表示されます）";
			tssl[1].AutoSize = true;
			tssl[2] = new ToolStripStatusLabel();
			tssl[2].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[2].BorderStyle = Border3DStyle.SunkenInner;
			tssl[2].BackColor = SystemColors.Control;
			tssl[2].TextAlign = ContentAlignment.MiddleLeft;
			tssl[2].Text = FileName;
			tssl[2].ToolTipText = tssl[2].Text;								//ToolTip設定
			tssl[2].Spring = true;
			statusStrip.Items.AddRange(tssl);
			statusStrip.ShowItemToolTips = true;							//ToolTip表示
			this.Controls.Add(this.statusStrip);							//StatusStrip(ステータスバー)を追加
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
			{
				e.Cancel = true;
			}
			else
			{
				//ゲームログの保存
				dr = MessageBox.Show("現在のセル状況を記録しますか？", "ログ記録", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
				{
					world.Make_Log();							//終了時の全セルの状態をログに記録する
				}
				//タイマーの廃棄
				GameTimer.Dispose();
			}
		}

		//「データを開く」処理
		private void OnOpen_Click(object sender, EventArgs e)
		{
			OpenFileDialog ofDlg = new OpenFileDialog();
			//ファイルフィルターの指定
			ofDlg.Filter = "地形データファイル|*.trn";
			ofDlg.FilterIndex = 0;
			ofDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			ofDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			ofDlg.InitialDirectory = Path.GetDirectoryName(myOwn.Location);	// デフォルトのフォルダーの指定
			ofDlg.Title = "ファイルを開く";	//ダイアログのタイトルを指定する
			if(ofDlg.ShowDialog(this) == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				if(Path.GetExtension(ofDlg.FileName) == ".trn")
				{
					tssl[2].Text = ofDlg.FileName;
					tssl[2].ToolTipText = ofDlg.FileName;	//ToolTip設定
					//背景描画処理
					world.Read_Map(ofDlg.FileName);
					world.ShowMap();
				}
				else
				{
					//エラー処理
					MessageBox.Show("地形データファイルではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
			//オブジェクトを破棄する
			ofDlg.Dispose();
		}

		//「終了」処理
		private void OnExit_Click(object sender, EventArgs e)
		{
			Close();	//修了確認はOnClosingメソッドで行う
		}

		//「ゲーム開始」処理
		private void OnStart_Click(object sender, EventArgs e)
		{

			InputDlg inpDlg = new InputDlg();
			inpDlg.ShowDialog(this);
			world.Create_Cells(inpDlg.NoOfCells, inpDlg.IntMarg);
			if(inpDlg.MeToo)								//アバターセルのID
				world.MyID = World.rand.Next(inpDlg.NoOfCells);
			world.ShowMap();								//「世界」を表示する
			if(!GameTimer.Enabled)
			{
				GameHours = 0;								//ゲーム空間内の時間を初期化
				GameTimer.Start();							//タイマー割り込み開始
			}
			inpDlg.Dispose();
			//メニュー・ツールバーボタンの状態設定
			SetStatus(true);
		}

		//Timer割り込みによる「ゲーム」処理
		private void OnTimer(object sender, EventArgs e)
		{
			//終了チェック
			if(world.Is_GameOver())
			{
				GameTimer.Stop();								//タイマー割り込み停止
				MessageBox.Show(world.Get_Message(), "ゲーム終了通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				GameTimer.Stop();							//タイマー割り込み停止（アバター処理による追加）
				world.Goes_Around();						//「世界」の中でセルが活動する
				world.ShowMap();							//「世界」を表示する
				GameHours++;								//Goes_Around実行毎に増加する
				GameTimer.Start();							//タイマー割り込み再開（アバター処理による追加）
				//経過時間計算
				int days = GameHours / 24;
				int hh = GameHours % 24;
				int yy = days / 365;
				int dd = days % 365;
				if(yy > 0)
					tssl[1].Text = yy.ToString() + "年" + dd.ToString() + "日" + hh.ToString() + "時間経過";
				else
					tssl[1].Text = dd.ToString() + "日" + hh.ToString() + "時間経過";
			}
		}

		//「Cellの情報」処理
		private void OnInfo_Click(object sender, EventArgs e)
		{
			txtDlg txtdlg = new txtDlg(Icon, world.Show_Cell_Param());
			txtdlg.ShowDialog(this);
			txtdlg.Dispose();
		}

		//「ゲーム終了」処理
		private void OnEnd_Click(object sender, EventArgs e)
		{
			if(!world.Is_GameOver())						//未終了チェック
			{
				GameTimer.Stop();							//タイマー割り込み停止
				world.GameOver();							//ゲーム強制終了
			}
			AbortGame(sender, e);
		}

		//ゲーム終了時処理
		private void AbortGame(object sender, EventArgs e)
		{
			//ゲームログの保存
			DialogResult dr = MessageBox.Show("現在のセル状況を記録しますか？", "ログ記録",
												MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
			{
				world.Make_Log();							//終了時の全セルの状態をログに記録する
			}
			//Worldを初期化
			world.Init();
			//メニュー・ツールバーボタンの状態設定
			SetStatus(false);
			dr = MessageBox.Show("他の地形図を読み込みますか？",
								"地形図の確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
				OnOpen_Click(sender, e);
		}

		//「使い方」処理
		private void OnHowtoPlay_Click(object sender, EventArgs e)
		{
			string data = String.Empty;				//"HowToPlayCell.txt"ファイル入力
			try
			{
				using(StreamReader file = new StreamReader("HowToPlayCell.txt", Encoding.UTF8))	//入力UTF-8
				{
					data = file.ReadToEnd();		//ファイルを読む
					file.Close();					//ファイルを閉じる
				}
			}
			catch(FileNotFoundException ex)
			{
				string errMessage = "使い方のファイル（\"HowToPlayCell.txt\"）を表示できません。" + Environment.NewLine + ex.Message;
				MessageBox.Show(errMessage, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			txtDlg txtdlg = new txtDlg(Icon, data, "使い方");
			txtdlg.ShowDialog(this);
			txtdlg.Dispose();
		}

		//「バージョン」処理
		private void OnVersion_Click(object sender, EventArgs e)
		{
			VersionDlg verDlg = new VersionDlg(this.Icon);	//Versionダイアログ表示
			verDlg.ShowDialog(this);
			verDlg.Dispose();
		}

		//メニュー・ボタンの状態を設定する
		private void SetStatus(bool game = false)
		{
			miOpen.Enabled = !game;			//「データを開く」メニューアイテム
			miStart.Enabled = !game;		//「ゲーム開始」メニューアイテム
			miCellInfo.Enabled = game;		//「セルの情報」メニューアイテム
			miEnd.Enabled = game;			//「ゲーム終了」メニューアイテム
			tsButton[0].Enabled = !game;	//「データを開く」ボタン
			tsButton[2].Enabled = !game;	//「ゲーム開始」ボタン
			tsButton[3].Enabled = game;		//「セルの情報」ボタン
			tsButton[4].Enabled = game;		//「ゲーム終了」ボタン
		}
	}

	/////////////////////////////
	//Cell数、属性入力ダイアログ
	/////////////////////////////
	class InputDlg : Form
	{
		//ダイアログのフィールド
		public int NoOfCells;
		public bool IntMarg;
		public bool MeToo;
		//ダイアログのコントロール
		Button BtnOK;
		ComboBox DDList;		//DropDownStyleプロパティをDropDownList
		CheckBox IMCheck;		//InterMarrige可否指定
		CheckBox MeCheck;		//アバター参加指定

		public InputDlg()
		{
			//ダイアログの属性設定
			this.Text = "Cellの生成数を指定";
			this.ClientSize = new Size(140, 140);
			this.ControlBox = false;		//システムボタン無効
			this.ShowInTaskbar = false;		//タスクバー上非表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	//親ダイアログ中央に配置
			this.Load += Form_Load;
		}

		//OnLoad処理
		private void Form_Load(object sender, EventArgs e)
		{
			//コントロールの属性設定
			BtnOK = new Button();
			BtnOK.Location = new Point((ClientSize.Width - BtnOK.Width) / 2, ClientSize.Height - BtnOK.Height - 10);
			BtnOK.Text = "決定";
			BtnOK.AutoSize = true;
			BtnOK.Click += new EventHandler(OnOK_Click);
			this.Controls.Add(BtnOK);

			DDList = new ComboBox();
			DDList.DropDownStyle = ComboBoxStyle.DropDownList;
			DDList.Location = new Point((ClientSize.Width - DDList.Width) / 2, 10);
			DDList.MaxDropDownItems = 8;
			for(int i = 0; i < DDList.MaxDropDownItems; i++)
			{
				string item = ((i + 1) * 8).ToString() + " cells";
				DDList.Items.Add(item);
			}
			DDList.SelectedIndex = 0;
			this.Controls.Add(DDList);

			IMCheck = new CheckBox();
			IMCheck.TextAlign = ContentAlignment.MiddleLeft;
			IMCheck.Location = new Point((ClientSize.Width - IMCheck.Width) / 2, 40);
			IMCheck.Size = new Size(160, 24);
			IMCheck.Text = "異種族間婚許可";
			this.Controls.Add(IMCheck);

			MeCheck = new CheckBox();
			MeCheck.TextAlign = ContentAlignment.MiddleLeft;
			MeCheck.Location = new Point((ClientSize.Width - MeCheck.Width) / 2, 70);
			MeCheck.Size = new Size(160, 24);
			MeCheck.Text = "アバターで参加";
			this.Controls.Add(MeCheck);
		}

		//OKボタン処理
		protected void OnOK_Click(object sender, EventArgs e)
		{
			if(DDList.SelectedIndex == -1)
				MessageBox.Show("コンボボックスが選択されていません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			else
			{
				NoOfCells = (DDList.SelectedIndex + 1) * 8;
				IntMarg = IMCheck.Checked;
				MeToo = MeCheck.Checked;
				Close();
			}
		}
	}

	/////////////////////////
	//テキスト表示ダイアログ
	/////////////////////////
	public class txtDlg : Form
	{
		//クラスフィールド
		string txtData;
		//クラスコントロール
		TextBox txtBox;
		Button extBtn;

		public txtDlg(Icon ico, string data = "", string title = "セル情報一覧")
		{
			txtData = data;
			this.Icon = ico;
			this.Size = new Size(800, 500);
			this.MinimumSize = new Size(640, 480);
			this.Text = title;
			this.StartPosition = FormStartPosition.CenterParent;	//親ダイアログ中央に配置
			this.Load += txtDlg_Load;
		}

		protected override void OnResize(EventArgs e)
		{
			//OnResize既定処理
			base.OnResize(e);
			//txtBoxコントロールを中央に配置
			if(txtBox != null)	//ダイアログ作成時はnullでエラーとなる為
				txtBox.Left = (ClientSize.Width - txtBox.Width) / 2;
		}

		private void txtDlg_Load(object sender, EventArgs e)
		{
			//Exitボタン
			extBtn = new Button();
			extBtn.Location = new Point((ClientSize.Width - extBtn.Width) / 2, ClientSize.Height - extBtn.Height - 10);
			extBtn.Text = "終了";
			extBtn.Anchor = AnchorStyles.Bottom;
			extBtn.Click += extBtn_Click;
			this.Controls.Add(extBtn);

			//テキストボックス
			txtBox = new TextBox();
			txtBox.Width = ClientSize.Width - 20;
			txtBox.Height = ClientSize.Height - extBtn.Height - 30;
			txtBox.Location = new Point(10, 10);
			txtBox.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			txtBox.BackColor = Control.DefaultBackColor;
			txtBox.Multiline = true;
			txtBox.ScrollBars = ScrollBars.Both;
			txtBox.WordWrap  = false;
			//テキストデータ
			txtBox.Text = txtData;
			//FormにTextBoxを追加
			this.Controls.Add(txtBox);
		}

		private void extBtn_Click(object sender, EventArgs e)
		{
			//終了する
			Close();
		}
	}

	/////////////////////
	//Version ダイアログ
	/////////////////////
	class VersionDlg : Form
	{
		public VersionDlg(Icon ico)
		{
			//ダイアログの属性設定
			this.Text = "バーション情報";
			this.ClientSize = new Size(320, 100);
			this.MaximizeBox = false;		// 最大化ボタン
			this.MinimizeBox = false;		// 最小化ボタン
			this.ShowInTaskbar = false;		//タスクバー上表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	// 親フォームの中央に配置
			//コントロールの属性設定
			Button btnOK = new Button();
			btnOK.Size = new Size(40, 28);
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, (ClientSize.Height - btnOK.Height) / 2);
			btnOK.Text = "OK";
			btnOK.Click += new EventHandler(OnOK_Click);
			Label imglabel = new Label();
			imglabel.Size = new Size(40, 40);
			imglabel.Location = new Point(10, (ClientSize.Height - imglabel.Height) / 2);
			imglabel.BorderStyle = BorderStyle.Fixed3D;
			imglabel.Image = ico.ToBitmap();						//親のシステムアイコン
			Label label = new Label();
			label.Size = new Size(ClientSize.Width - imglabel.Width - btnOK.Width - 40, ClientSize.Height- 20);
			label.Location = new Point(imglabel.Width + 20, (ClientSize.Height - label.Height) / 2);
			label.BorderStyle = BorderStyle.Fixed3D;
			label.Text = "Cells for C#\r\nVersion 2.0\r\nCopyright (c) 2026 by Ysama\r\n(written in Microsoft C#)";
			label.TextAlign = ContentAlignment.MiddleCenter;
			label.Font = new Font("Times New Roman", 10, FontStyle.Bold);
			this.Controls.Add(btnOK);
			this.Controls.Add(imglabel);
			this.Controls.Add(label);
		}

		private void OnOK_Click(object sender, EventArgs e)
		{
			Close();
		}
	}
}
