转 vb.net chart图表使用技巧之一 vb.net chart图表使用技巧之一

vb.net chart图表使用技巧之一

很多朋友再为使用什么样曲线来显示数据发愁,当然有MONEY的朋友除外。其实微软已经给我们提供一个很强大免费的控件,那就是chart ,当然这个控件只能再vs.2008以上的版本才能使用。不过很少有人介绍怎么使用。于是本人花了一天时间,认真进行学习。

详细的程序如下,中间我已经作了很多说明,呵呵

[vb]  view plain  copy
  1. Private AddDataRunner As Thread  
  2. Private Rand As New Random()  
  3. Public Delegate Sub AddDataDelegate()  '定义一个线程委托  
  4. Public AddDataDel As AddDataDelegate  
  5. Private minValue, maxValue As DateTime  
  6.   
  7. Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load  
  8.     '定义一个新的线程进行循环执行  
  9.     Dim addDataThreadStart As New ThreadStart(AddressOf AddDataThreadLoop)  
  10.     '把线程交给公共线程来管理  
  11.     AddDataRunner = New Thread(addDataThreadStart)  
  12.     '委托交付管理  
  13.     addDataDel = New AddDataDelegate(AddressOf AddData)  
  14.   
  15. End Sub  
  16.   
  17. ''' <summary>  
  18. ''' 主线程每秒循环一次,并通过委托,将数据发给你 CHART  
  19. ''' </summary>  
  20. ''' <remarks></remarks>  
  21. Private Sub AddDataThreadLoop()  
  22.     While True  
  23.         chart1.Invoke(addDataDel)  
  24.   
  25.         Thread.Sleep(1000)  
  26.     End While  
  27. End Sub 'AddDataThreadLoop  
  28.   
  29. Public Sub AddData()  
  30.     Dim timeStamp As DateTime = DateTime.Now  
  31.   
  32.     Dim ptA As ChartArea  
  33.     For Each ptA In Chart1.ChartAreas  
  34.         Dim ptSeries As Series  
  35.         '对每series进行数据扫描  
  36.         For Each ptSeries In Chart1.Series  
  37.             Dim k As Single  
  38.             k = Rand.Next(10, 50)  
  39.             AddNewPoint(timeStamp, k, ptSeries)  
  40.         Next ptSeries  
  41.     Next  
  42. End Sub 'AddData  
  43.   
  44.   
  45. ''' <summary>  
  46. ''' x轴为时间,y轴为数据,并根据随机数据进行填写;  
  47. ''' </summary>  
  48. ''' <param name="timeStamp"></param>  
  49. ''' <param name="ptSeries"></param>  
  50. ''' <remarks></remarks>  
  51. Public Sub AddNewPoint(timeStamp As DateTime, ByVal pValue As Single, ptSeries As System.Windows.Forms.DataVisualization.Charting.Series)  
  52.     Dim newVal As Double = 0  
  53.   
  54.     If ptSeries.Points.Count > 0 Then  
  55.         newVal = ptSeries.Points((ptSeries.Points.Count - 1)).YValues(0) + (Rand.NextDouble() * 2 - 1)  
  56.     End If  
  57.   
  58.     If newVal < 0 Then  
  59.         newVal = 0  
  60.     End If  
  61.   
  62.     ' Add new data point to its series.  
  63.     ptSeries.Points.AddXY(timeStamp.ToOADate, pValue)  
  64.   
  65.     ' remove all points from the source series older than 1.5 minutes.  
  66.     Dim removeBefore As Double = timeStamp.AddSeconds((CDbl(90) * -1)).ToOADate()  
  67.     'remove oldest values to maintain a constant number of data points  
  68.     While ptSeries.Points(0).XValue < removeBefore  
  69.         ptSeries.Points.RemoveAt(0)  
  70.     End While  
  71.   
  72.     Dim ptA As ChartArea  
  73.     For Each ptA In Chart1.ChartAreas  
  74.         ptA.AxisX.Minimum = ptSeries.Points(0).XValue  
  75.         ptA.AxisX.Maximum = DateTime.FromOADate(ptSeries.Points(0).XValue).AddMinutes(2).ToOADate()  
  76.     Next  
  77.     
  78.     Chart1.Invalidate()  
  79. End Sub  
  80.   
  81. ' Clean up any resources being used.  
  82. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)  
  83.     If (addDataRunner.ThreadState And ThreadState.Suspended) = ThreadState.Suspended Then  
  84.         addDataRunner.Resume()  
  85.     End If  
  86.     addDataRunner.Abort()  
  87.   
  88.     If disposing Then  
  89.         If Not (components Is NothingThen  
  90.             components.Dispose()  
  91.         End If  
  92.     End If  
  93.     MyBase.Dispose(disposing)  
  94. End Sub 'Dispose  
  95.   
  96.   
  97.   
  98. Private Sub startTrending_Click(sender As System.Object, e As System.EventArgs) Handles startTrending.Click  
  99.     ' 开始按钮状态  
  100.     startTrending.Enabled = False  
  101.     ' 停止按钮状态  
  102.     stopTrending.Enabled = True  
  103.   
  104.     ' Predefine the viewing area of the chart  
  105.     minValue = DateTime.Now  
  106.     '2分钟预览区域  
  107.     maxValue = minValue.AddSeconds(120)  
  108.   
  109.     Chart1.ChartAreas(0).AxisX.Minimum = minValue.ToOADate()  
  110.     Chart1.ChartAreas(0).AxisX.Maximum = maxValue.ToOADate()  
  111.   
  112.     Chart1.ChartAreas(1).AxisX.Minimum = minValue.ToOADate()  
  113.     Chart1.ChartAreas(1).AxisX.Maximum = maxValue.ToOADate()  
  114.   
  115.     ' Reset number of series in the chart.  
  116.     Chart1.Series.Clear()  
  117.   
  118.     ' create a line chart series  
  119.     Dim newSeries1 As New Series("Series1")  
  120.     With newSeries1  
  121.         .LegendText = "曲线一"  
  122.         .ChartType = SeriesChartType.Line  
  123.         .BorderWidth = 1  
  124.         .Color = Color.Red  
  125.         .XValueType = ChartValueType.Time  
  126.     End With  
  127.     newSeries1.ChartArea = "ChartArea1"  
  128.   
  129.     Dim newSeries2 As New Series("Series2")  
  130.     With newSeries2  
  131.         .LegendText = "曲线二"  
  132.         .ChartType = SeriesChartType.Line  
  133.         .BorderWidth = 1  
  134.         .Color = Color.Blue  
  135.         .XValueType = ChartValueType.Time  
  136.     End With  
  137.     newSeries2.ChartArea = "ChartArea2"  
  138.   
  139.     Chart1.Series.Add(newSeries1)  
  140.     Chart1.Series.Add(newSeries2)  
  141.   
  142.     ' start worker threads.  
  143.     If addDataRunner.IsAlive = True Then  
  144.         addDataRunner.Resume()  
  145.     Else  
  146.         addDataRunner.Start()  
  147.     End If  
  148. End Sub  
  149.   
  150. Private Sub stopTrending_Click_1(sender As System.Object, e As System.EventArgs) Handles stopTrending.Click  
  151.     If addDataRunner.IsAlive = True Then  
  152.         addDataRunner.Resume()  
  153.     End If  
  154.   
  155.     ' Enable all controls on the form  
  156.     startTrending.Enabled = True  
  157.     ' and only Disable the Stop button  
  158.     stopTrending.Enabled = False  
  159. End Sub  

猜你喜欢

转载自blog.csdn.net/sefwin/article/details/80368813