//Visual Studioで行われる一般的Windowsプログラム用クラス宣言
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//MS Chart利用の為追加される宣言
using System.Windows.Forms.DataVisualization.Charting;
/*
	但し、DataVisualizationクラスは一般的なクラスが入っているフォールダー
		C:\Windows\Microsoft.NET\assembly\GAC_32(64)
	ではなく、csc.exeがデフォルトでは参照しないフォールダーである
		C:\Windows\Microsoft.NET\assembly\GAC_MSIL
	に入っているため、Visual Studioではプロジェクトの「参照」で行うcsc.exe
	のオプションに以下を与える必要がある。
	"RefFile=C:\Windows\Microsoft.NET\assembly\GAC_MSIL\...\System.Windows.Forms.DataVisualization.dll"
	（注：私のシステムで...は"System.Windows.Forms.DataVisualization\v4.0_4.0.0.0__31bf3856ad364e35"）
*/

namespace SampleMSChart
{
	public partial class SampleChart : Form
	{
		//MS Charコントロールインスタンス（ポインター）
		Chart chart;

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

		//コンストラクター
		public SampleChart()
		{
			//フォームの設定
			this.Size = new Size(800, 480);
			this.MinimumSize = new Size(320, 190);
			this.Text = "Sample - MS Chart";
			this.Load += Form_Load;		//WM_CREATE処理
		}

		//WM_CREATE処理
		private void Form_Load(object sender, EventArgs e)
		{
			//Visual Studioでは以下の処理が InitControls(); で行われる
			//MS Chart インスタンスの生成と設定
			chart = new Chart();
			chart.Location = new Point(10, 10);
			chart.Size = new Size(ClientSize.Width - 20, ClientSize.Height - 20);
			chart.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left);
			chart.Legends.Add("Legend1");	//Addしないと「凡例」が表示されない
/*
			//凡例の幅と高さを設定
			chart.Legends[0].Position.Auto = false;
			chart.Legends[0].Position.Width = 20.0f;
			chart.Legends[0].Position.Height = 20.0f;
			//凡例の位置を設定します
			chart.Legends[0].Position.X = 80.0f; 
			chart.Legends[0].Position.Y = 90.0f;
*/
			this.Controls.Add(chart);
			//MS Chart上でマウスクリックした場合の処理を追加
			chart.Click += Chart_Click;
		}

		//MS Chart上でマウスクリックした場合の処理
		private void Chart_Click(object sender, System.EventArgs e)
		{
			//Sample 1
			MessageBox.Show("最初のサンプルです", "サンプル１", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Sample1();
			//Sample 2
			MessageBox.Show("二番目ののサンプルです", "サンプル２", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Sample2();
			//Sample 3
			MessageBox.Show("三番目のサンプルです", "サンプル３", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Sample3();
			//Sample 4
			MessageBox.Show("最後のサンプルです", "サンプル４", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Sample4();
		}
		
		//Sample 1
		private void Sample1()
		{
			//サンプル用データ 
			double[] pointX = { 1.0, 2.0, 3.0, 4.0, 5.0 };
			double[] pointY = { 1.0, 2.0, 3.0, 4.0, 5.0 };
			//MS Chartの初期化
			chart.Series.Clear();
			chart.ChartAreas.Clear();
			chart.Titles.Clear();
			//タイトル作成
			Title title = new Title("サンプル１");
			//チャートエリアの作成
			ChartArea chartAria = new ChartArea("Area1");
			//系列(Series)の作成
			Series series = new Series();
			series.ChartType = SeriesChartType.Line;	//系列の種類を折れ線グラフ(Line)に設定
			series.LegendText = "凡例";					//系列の凡例を設置
			series.IsVisibleInLegend = true;
			//ポイントデータを設定
			for (int i = 0; i < 5; i++)
			{
				series.Points.AddXY(pointX[i], pointY[i]);
			}
			//チャートの設定
			chart.Titles.Add(title);
			chart.ChartAreas.Add(chartAria);
			chart.Series.Add(series);
		}
		
		//Sample 2
		private void Sample2()
		{
			//MS Chartの初期化
			chart.Series.Clear();
			chart.ChartAreas.Clear();
			chart.Titles.Clear();
			//タイトル設定
			Title title = new Title("サンプル２");
			//チャートエリアの作成
			ChartArea chartAria = new ChartArea("Area1");
			chartAria.AxisX.Title = "X軸";
			chartAria.AxisY.Title = "Y軸";
			//系列の作成
			Series series = new Series();
			series.ChartType = SeriesChartType.Line;	//系列の種類を折れ線グラフ(Line)に設定
			series.LegendText = "凡例:折れ線グラフ";	//系列の凡例を設置
			series.BorderWidth = 3;						//系列の境界線太さ
			series.MarkerStyle = MarkerStyle.Circle;	//系列のポイントマークの形状
			series.MarkerSize = 12;						//系列のポイントマークの大きさ
			series.Color = Color.BlueViolet;
			//系列の追加とデータ作成
			Series seriesColumn = new Series();
			seriesColumn.LegendText = "凡例:棒グラフ";
			seriesColumn.ChartType = SeriesChartType.Column;
			seriesColumn.Color = Color.DeepSkyBlue;
			//乱数を使ったデータ作成
			Random rdm = new Random();
			for (int i = 0; i < 10; i++)
			{
				series.Points.Add(new DataPoint(i, rdm.Next(0, 210)));
			}
			for (int i = 0; i < 10; i++)
			{
				seriesColumn.Points.Add(new DataPoint(i, rdm.Next(0, 210)));
			}
			//チャート設定
			chart.Titles.Add(title);
			chart.ChartAreas.Add(chartAria);
			chart.Series.Add(seriesColumn);
			chart.Series.Add(series);
		}

		//Sample 3
		private void Sample3()
		{
			//MS Chartの初期化
			chart.Series.Clear();
			chart.ChartAreas.Clear();
			chart.Titles.Clear();
			//タイトル設定
			Title title = new Title("サンプル３");
			//チャートエリア作成
			ChartArea chartAria = new ChartArea("Area1");
			//系列の作成
			string legend = "PieGraph";
			Series series = new Series(legend);
//			series.ChartType = SeriesChartType.Pie;			//系列の種類を円グラフ(Pie)に設定
			series.ChartType = SeriesChartType.Doughnut;	//系列の種類を円グラフ(Doughnut)に設定
			series.LegendText = "凡例:円グラフ";			//系列の凡例を設置
			series.BorderWidth = 2;							//系列の境界線太さ
			//乱数を使ったデータ作成
			Random rdm = new Random();
			double[] values = new double[5];
			double total = 0.0;
			for(int i = 0; i < values.Length; i++)
			{
				values[i] = (double)rdm.Next(0, 20);
				total += values[i];
			}
			//系列にデータを設定
			for(int i = 0; i < values.Length; i++)
			{
				double rate = (int)(values[i]  * 10000.0 / total) / 100.0;	//小数点以下2桁にする
				series.Points.Add(new DataPoint(rate, rate));
				series.Points[i].LegendText = "製品" + i.ToString() + ": " + rate.ToString(); 
			}
			//チャート設定
			chart.Titles.Add(title);
			chart.ChartAreas.Add(chartAria);
			chart.Series.Add(series);
			chart.ChartAreas["Area1"].BackColor = Color.SeaShell;	//背景色を変更
		}

		//Sample 4
		private void Sample4()
		{
			//MS Chartの初期化
			chart.Series.Clear();
			chart.ChartAreas.Clear();
			chart.Titles.Clear();
			//タイトル設定
			Title title = new Title("サンプル４");
			Title title1 = new Title("グラフ１");
			Title title2 = new Title("グラフ２");
			title1.DockedToChartArea = "Area1";		// ChartAreaとの紐付
			title2.DockedToChartArea = "Area2";		// ChartAreaとの紐付
			//チャートエリア作成
			ChartArea chartAria = new ChartArea("Area1");
			chartAria.AxisX.Title = "X軸";
			chartAria.AxisY.Title = "Y軸";
			ChartArea chartAria2 = new ChartArea("Area2");
			chartAria2.AxisX.Title = "X軸";
			chartAria2.AxisY.Title = "Y軸";
			//系列の作成
			Series series = new Series();
			series.ChartType = SeriesChartType.Line;	//系列の種類を折れ線グラフ(Line)に設定
			series.LegendText = "凡例:折れ線グラフ";	//系列の凡例を設置
			series.BorderWidth = 2;						//系列の境界線太さ
			series.MarkerStyle = MarkerStyle.Circle;	//系列のポイントマークの形状
			series.MarkerSize = 12;						//系列のポイントマークの大きさ
 			//乱数を使ったデータ作成
			Random rdm = new Random();
			for (int i = 0; i < 10; i++)
			{
				series.Points.Add(new DataPoint(i, rdm.Next(0, 210)));
			}
			series.ChartArea = "Area1";					// ChartAreaとの紐付
			//系列の追加とデータ作成
			Series seriesColumn = new Series();
			seriesColumn.LegendText = "凡例:棒グラフ";
			seriesColumn.ChartType = SeriesChartType.Column;
			for (int i = 0; i < 10; i++)
			{
				seriesColumn.Points.Add(new DataPoint(i, rdm.Next(0, 210)));
			}
			seriesColumn.ChartArea = "Area2";			// ChartAreaとの紐付
			//チャート設定
			chart.Titles.Add(title);
			chart.Titles.Add(title1);
			chart.Titles.Add(title2);
			chart.ChartAreas.Add(chartAria);
			chart.ChartAreas.Add(chartAria2);
			chart.Series.Add(series);
			chart.Series.Add(seriesColumn);
			chart.ChartAreas["Area1"].BackColor = Color.WhiteSmoke;	//背景色を変更
		}
	}
}
