動態chart Demo

  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 }
View Code
相關文章
相關標籤/搜索