1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Windows.Forms.DataVisualization.Charting; 10 using CommonLib; 11 12 namespace ChartDemo 13 { 14 public partial class Form1 : Form 15 { 16 17 /* 涉及知識點: 18 19 Chart 控件,功能強大,能夠繪製柱狀圖,折線圖,波形圖,餅狀圖,大大簡化了對圖的開發與定製。 20 Chart控件的相關概念: 21 22 ChartArea,表示圖表區域,一個Chart能夠繪製多個ChartArea,重疊在一塊兒。 23 Series ,表示數據序列,每一個ChartArea能夠有多個數據線。即,Series屬於ChartArea. 24 AxisX,AxisY,表示主座標軸,每個ChartArea都有對應的座標軸,包括主座標軸,輔座標軸 25 Queue集合,表示先進先出的集合。 26 主要有兩個方法: 27 28 Dequeue() 表示移除並返回位於 System.Collections.Generic.Queue<T> 開始處的對象。 29 Enqueue() 表示將對象添加到 System.Collections.Generic.Queue<T> 的結尾處。 30 Timer ,定時器,定時之行相應的功能,更新數據,刷新圖表。 31 32 */ 33 34 private Queue<double> dataQueue = new Queue<double>(100); 35 private int curValue = 0; 36 private int num = 5;//每次刪除增長几個點 37 38 public Form1() 39 { 40 Logger.Instance.WriteLog("Start InitializeComponent Form1"); 41 InitializeComponent(); 42 Logger.Instance.WriteLog("End InitializeComponent Form1"); 43 } 44 45 /// <summary> 46 /// 初始化圖表 47 /// </summary> 48 private void InitChart() 49 { 50 //定義圖表區域 51 this.chart1.ChartAreas.Clear(); 52 ChartArea chartArea1 = new ChartArea("C1"); 53 ChartArea chartArea12 = new ChartArea("C2"); 54 this.chart1.ChartAreas.Add(chartArea1); 55 this.chart1.ChartAreas.Add(chartArea12); 56 57 //定義存儲和顯示點的容器 58 this.chart1.Series.Clear(); 59 Series series1 = new Series("S1"); 60 series1.ChartArea = "C1"; 61 this.chart1.Series.Add(series1); 62 63 //設置圖表顯示樣式 64 this.chart1.ChartAreas[0].AxisX.Minimum = 0; 65 this.chart1.ChartAreas[0].AxisX.Maximum = 100; 66 this.chart1.ChartAreas[0].AxisX.Interval = 5; 67 this.chart1.ChartAreas[0].AxisY.Minimum = 0; 68 this.chart1.ChartAreas[0].AxisY.Maximum = 100; 69 this.chart1.ChartAreas[0].AxisY.Interval = 10; 70 this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Blue ; 71 this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Blue; 72 //設置標題 73 74 this.chart1.Titles.Clear(); 75 this.chart1.Titles.Add("S01"); 76 this.chart1.Titles[0].Text = "隨機數顯示"; 77 this.chart1.Titles[0].ForeColor = Color.RoyalBlue; 78 this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); 79 80 //設置圖表顯示樣式 81 this.chart1.Series[0].Color = Color.Red; 82 83 if (Rb_Brokenline.Checked) 84 { 85 this.chart1.Titles[0].Text =string.Format( "隨機數 {0} 顯示",Rb_Brokenline.Text); 86 this.chart1.Series[0].ChartType = SeriesChartType.Line; 87 } 88 if (Rb_Waveform.Checked) { 89 this.chart1.Titles[0].Text = string.Format("隨機數 {0} 顯示", Rb_Waveform.Text); 90 this.chart1.Series[0].ChartType = SeriesChartType.Spline; 91 } 92 this.chart1.Series[0].Points.Clear(); 93 } 94 95 //更新隊列中的值 96 private void UpdateQueueValue() 97 { 98 99 if (dataQueue.Count > 100) { 100 //先出列 101 for (int i = 0; i < num; i++) 102 { 103 dataQueue.Dequeue(); 104 } 105 } 106 if (Rb_Brokenline.Checked) 107 { 108 Random r = new Random(); 109 for (int i = 0; i < num; i++) 110 { 111 dataQueue.Enqueue(r.Next(0, 100)); 112 } 113 } 114 if (Rb_Waveform.Checked) { 115 for (int i = 0; i < num; i++) 116 { 117 //對curValue只取[0,360]之間的值 118 curValue = curValue % 360; 119 //對獲得的正玄值,放大50倍,並上移50 120 dataQueue.Enqueue((50*Math.Sin(curValue*Math.PI / 180))+50); 121 curValue=curValue+10; 122 } 123 } 124 } 125 126 127 /// <summary> 128 /// 初始化事件 129 /// </summary> 130 /// <param name="sender"></param> 131 /// <param name="e"></param> 132 private void Btn_Init_Click(object sender, EventArgs e) 133 { 134 InitChart(); 135 } 136 137 /// <summary> 138 /// 開始事件 139 /// </summary> 140 /// <param name="sender"></param> 141 /// <param name="e"></param> 142 private void Btn_Start_Click(object sender, EventArgs e) 143 { 144 this.timer1.Start(); 145 } 146 147 148 /// <summary> 149 /// 中止事件 150 /// </summary> 151 /// <param name="sender"></param> 152 /// <param name="e"></param> 153 private void Btn_Stop_Click(object sender, EventArgs e) 154 { 155 this.timer1.Stop(); 156 } 157 158 159 /// <summary> 160 /// 定時器事件 161 /// </summary> 162 /// <param name="sender"></param> 163 /// <param name="e"></param> 164 private void timer1_Tick_1(object sender, EventArgs e) 165 { 166 UpdateQueueValue(); 167 this.chart1.Series[0].Points.Clear(); 168 for (int i = 0; i < dataQueue.Count; i++) 169 { 170 this.chart1.Series[0].Points.AddXY((i + 1), dataQueue.ElementAt(i)); 171 //add 172 //this.chart1.Series[1].Points.AddXY((i + 1), dataQueue.ElementAt(i)+1); 173 } 174 175 } 176 177 } 178 }