Hallo!
Das Chart-Control dient der PRÄSENTATION von Daten.
nicht der graphischen Daten-MANIPULATION.
Für solche Zwecke gibt es (kommerzielle) Controls.
Ich habe so etwas deshalb noch nie gemacht, aber
schnell mal ein kleines Beispiel zusammengebastelt,
das zeigt, wie das Chart auf Mausbewegungen reagieren kann.
Das kann für Deine speziellen Zwecke ausgebaut werden.
Imports System.Windows.Forms.DataVisualization.Charting
Public Class frmChartMouse
Dim WithEvents chart1 As New Chart With _
{.Parent = Me, .Dock = DockStyle.Fill}
Private Sub frmChart_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Chart mit Testdaten füllen
Dim x() As Double = {5, 6, 7, 8, 9, 10, 6, 6}
Dim y() As Double = {10, 11, 12, 13, 14, 15, 8, 12}
With chart1
.Series.Clear()
.Series.Add("Demo1")
.ChartAreas.Clear()
.ChartAreas.Add("Area1")
.Series(0).ChartArea = .ChartAreas(0).Name
With chart1.Series(0)
.ChartType = SeriesChartType.Point
For i As Integer = 0 To x.Length - 1
.Points.AddXY(x(i), y(i))
.Points(i).MarkerStyle = MarkerStyle.Circle
.Points(i).MarkerColor = Color.Black
.Points(i).MarkerSize = 12
Next i
End With
End With
End Sub
Private Sub chart1_MouseMove(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) Handles chart1.MouseMove
With chart1
'den nächstliegenden Punkt suchen
Dim npi As Integer = FindNextPoint(e.X, e.Y, .Series("Demo1"))
With .Series("Demo1")
'alle Marker zurücksetzen
For i As Integer = 0 To .Points.Count - 1
.Points(i).MarkerStyle = MarkerStyle.Circle
.Points(i).MarkerColor = Color.Black
Next i
If npi >= 0 Then
'nächsten Punkt markieren
.Points(npi).MarkerStyle = MarkerStyle.Cross
.Points(npi).MarkerColor = Color.Red
End If
End With
End With
End Sub
Private Function FindNextPoint(x As Integer, y As Integer, _
dataseries As Series) As Integer
'Routine ermittelt per Euklidischer Distanz den nächstliegenden
'Serienpunkt
Dim nextpointindex As Integer = -1
If Not TypeOf dataseries.Tag Is PointF() Then Return -1
Dim mindis As Double = Double.MaxValue
With dataseries
Dim pp As PointF() = DirectCast(dataseries.Tag, PointF())
For i As Integer = 0 To .Points.Count - 1
Dim Dis As Double = _
Math.Abs(x - pp(i).X) ^ 2 + Math.Abs(y - pp(i).Y) ^ 2
If Dis < mindis Then
mindis = Dis
nextpointindex = i
End If
Next i
End With
Return nextpointindex
End Function
Private Sub chart1_PostPaint(sender As Object, _
e As System.Windows.Forms.DataVisualization.Charting. _
ChartPaintEventArgs) Handles chart1.PostPaint
If TypeOf sender Is _
System.Windows.Forms.DataVisualization.Charting.Chart Then
Dim cht As Chart = CType(sender, Chart)
'Beim Zeichnen des Chart werden die absoluten Positionen der
'Datenpunkte ermittelt und in der Tag-Eigenschaft der Serien
'gespeichert
With cht
For s As Integer = 0 To .Series.Count - 1
With .Series(s)
'Ermittlung der aktuellen absoluten Punktepositionen
Dim pointposition(.Points.Count - 1) As PointF
For i As Integer = 0 To .Points.Count - 1
pointposition(i).X = _
CSng(e.ChartGraphics.GetPositionFromAxis _
(cht.ChartAreas(0).Name, AxisName.X, _
.Points(i).XValue))
pointposition(i).Y = _
CSng(e.ChartGraphics.GetPositionFromAxis _
(cht.ChartAreas(0).Name, AxisName.Y, _
.Points(i).YValues(0)))
pointposition(i) = _
e.ChartGraphics.GetAbsolutePoint(pointposition(i))
Next i
.Tag = pointposition
End With
Next s
End With
End If
End Sub
End Class
Beitrag wurde zuletzt am 17.10.14 um 19:51:05 editiert. |