///////////////////////////////
//Diceコントロール（Dices.dll）
///////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Resources;			//ResourceManagerを使う為
using System.IO;				//Streamを使う為

namespace Dices
{
	public class Dice : Button
	{
		//賽の目
		public int roll;
		//ビットマップ
		Bitmap[] bmpD = new Bitmap[6];
		//コンストラクター
		public Dice()
		{
			//このプログラムのアッセンブリーを取得する
			System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
			//ダイスの目のイメージを読み込む
			ResourceManager rm = new ResourceManager("Dice", asm);	//ResourceManagerインスタンスの作成
			bmpD[0] = (Bitmap)rm.GetObject("D1");
			bmpD[1]= (Bitmap)rm.GetObject("D2");
			bmpD[2] = (Bitmap)rm.GetObject("D3");
			bmpD[3] = (Bitmap)rm.GetObject("D4");
			bmpD[4] = (Bitmap)rm.GetObject("D5");
			bmpD[5] = (Bitmap)rm.GetObject("D6");
			//さいころの初期値は１
			//this.Image = bmpD[0];	//イメージレイアウトが指定できない
			this.BackgroundImageLayout = ImageLayout.Zoom;
			this.BackgroundImage = bmpD[0];
			//押し下げられた時の処理
			this.Click += Dice_Click;
		}
		//デストラクター
		~Dice()
		{
			//ビットマップを廃棄
			bmpD[0].Dispose();
			bmpD[1].Dispose();
			bmpD[2].Dispose();
			bmpD[3].Dispose();
			bmpD[4].Dispose();
			bmpD[5].Dispose();
		}
		//Diceがクリックされた時の処理
		private void Dice_Click(object sender, EventArgs e)
		{
			//投賽音
			DiceSound();
			//賽を振る
			Roll();
		}
		//乱数を使用してさいころの目を返す
		public int Roll()
		{
			//乱数の初期化
			Random rand = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
			for(int i = 0; i < 10; i++)
			{
				roll = rand.Next(6);
				this.BackgroundImage = bmpD[roll];
				this.Refresh();						//Invalidate() + Update()の効果がある。
				System.Threading.Thread.Sleep(50);	//好みに応じてwaitを掛ける。
			}
			return roll + 1;
		}
		//Dice Roll時の音
		public void DiceSound(bool res = true)
		{
/*
			string soundl_file = "DiceSound1.wav";
			if(res) soundl_file = "DiceSound2.wav";
			//サウンドプレイヤーにwavファイルを読み込む
			System.Media.SoundPlayer player = new System.Media.SoundPlayer(soundl_file);
*/
			//このプログラムのアッセンブリーを取得する
			System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
			//Dice.resourcesを読み込む
			ResourceManager rm = new ResourceManager("Dice", asm);	//ResourceManagerインスタンスの作成
			//Waveファイル用Streamクラスインスタンスsound
			Stream sound;
			if(res)
				sound  = new MemoryStream((byte[])rm.GetObject("DiceSound1"));
			else
				sound  = new MemoryStream((byte[])rm.GetObject("DiceSound2"));
			//サウンドプレイヤーにWaveストリームを読み込む
			System.Media.SoundPlayer player = new System.Media.SoundPlayer(sound);
			//非同期再生する
			player.Play();
			//使用後サウンドプレイヤーを破棄する
			player.Dispose();
			//ストリームを廃棄
			sound.Dispose();
		}
	}

	///////////////////////////////////
	//DiceTest.cs - テスト用プログラム
	///////////////////////////////////
	public partial class AppForm : Form
	{
		Dice dice1, dice2, dice3;	//Diceコントロール
		Button rollbtn, extbtn;		//ボタンコントロール

		[STAThread]
		public static void Main()
		{
			Application.Run(new AppForm());
		}

		public AppForm()
		{
			System.Reflection.Assembly myOwn = System.Reflection.Assembly.GetEntryAssembly();
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.ClientSize = new Size(232, 120);
			this.MinimumSize = new Size(232, 120);
			this.Text = "Dice";
			this.Load += AppForm_Load;
			this.SizeChanged += AppForm_SizeChanged;
		}

		private void AppForm_Load(object sender, EventArgs e)
		{
			//Dice1
			dice1 = new Dice();
			dice1.Size = new Size(64, 64);
			dice1.Location = new Point(10, 10);
			dice1.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
			dice1.Click += Dice1_Click;
			this.Controls.Add(dice1);

			//Dice2
			dice2 = new Dice();
			dice2.Size = new Size(64, 64);
			dice2.Location = new Point(ClientSize.Width / 2 - 32, 10);
			dice2.Anchor = AnchorStyles.Top;
			dice2.Click += Dice2_Click;
			this.Controls.Add(dice2);

			//Dice3
			dice3 = new Dice();
			dice3.Size = new Size(64, 64);
			dice3.Location = new Point(ClientSize.Width - dice3.Width - 10, 10);
			dice3.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			dice3.Click += Dice3_Click;
			this.Controls.Add(dice3);

			//投賽ボタン
			rollbtn = new Button();
			rollbtn.Location = new Point(10, ClientSize.Height - rollbtn.Height - 10);
			rollbtn.Text = "投賽";
			rollbtn.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			rollbtn.Click += rollbtn_Click;
			this.Controls.Add(rollbtn);

			//終了ボタン
			extbtn = new Button();
			extbtn.Location = new Point(ClientSize.Width - extbtn.Width - 10, ClientSize.Height - extbtn.Height - 10);
			extbtn.Text = "終了";
			extbtn.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
			extbtn.Click += extbtn_Click;
			this.Controls.Add(extbtn);
		}

		//メインフォームのサイズ変更がプロパティに反映された場合
		private void AppForm_SizeChanged(object sender, EventArgs e)
		{
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
			{
				e.Cancel = true;
			}
		}

		private void Dice1_Click(object sender, EventArgs e)
		{
			//Dice1Roll
			MessageBox.Show((dice1.Roll()).ToString(), "Dice1の賽の目", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//dice1.Roll();
		}

		private void Dice2_Click(object sender, EventArgs e)
		{
			//Dice2
			MessageBox.Show((dice2.Roll()).ToString(), "Dice2の賽の目", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//dice2.Roll();
		}

		private void Dice3_Click(object sender, EventArgs e)
		{
			//Dice3
			MessageBox.Show((dice3.Roll()).ToString(), "Dice3の賽の目", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//dice3.Roll();
		}

		private void rollbtn_Click(object sender, EventArgs e)
		{
			//投賽処理
			dice1.DiceSound(false);
			dice1.Roll();
			//dice2.DiceSound(false);
			dice2.Roll();
			//dice3.DiceSound(false);
			dice3.Roll();
		}

		private void extbtn_Click(object sender, EventArgs e)
		{
			//終了処理
			Close();
		}
	}
}
