Rubrik: Controls | VB-Versionen: VB2005, VB2008, VB2010 | 11.04.11 |
MS-Chart - Position von Chartelementen in Pixel berechnen Die Funktion rechnet für verschiedene Chartelemente deren in Prozent angegebebene Position in Pixelwerte um. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 12.152 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wenn man MS-Chart einsetzt und dann über dem Chart noch andere Controls so positionieren möchte, dass sie in Abhängigkeit von einem Chartelement angeordnet werden, benötigt man praktischerweise die Koordinaten des Chartelements in Pixel. Für spezielle Chartelemente kann man die Position innerhalb des Chart-Controls in Prozentwerten setzen oder auslesen. Die nachfolgende Funktion berechnet aus den Prozentwerten entsprechende Pixelwerte. Sie wird im PostPaint-Ereignis des Chartcontrols angewendet. Eine Besonderheit liegt bei ChartArea-Element vor, weil es dafür zum einen die Eigenschaft 'Position' und zum anderen die Eigenschaft 'InnerPlotPosition' gibt. Ansonsten erklärt sich die Funktion ziemlich selbst. Sie gibt die Pixelkoodinaten des Chartelements als Rechteck-Koordinaten zurück.
Die Funktion:
Imports System.Windows.Forms.DataVisualization.Charting ...
''' <summary> ''' Ermitteln DisplayRectangle für spezielle Chartelemente in Pixel ''' </summary> ''' <param name="e">die ChartPaintEventArgs</param> ''' <param name="theChart">das Chart-Control</param> ''' <param name="theChartElement">das Chart-Element</param> ''' <param name="iPlot">soll bei ChartArea InnerPlotPosition verwendet werden ja|nein</param> ''' <returns>Rechteck mit den Pixelkoordinaten</returns> ''' <remarks>Die Funktion im PostPaint-Ereignis des Chart-Control anwenden!</remarks> Public Function getChartElementPositionInPixel(ByVal e As ChartPaintEventArgs, _ ByVal theChart As Chart, _ ByVal theChartElement As ChartElement, _ Optional ByVal iPlot As Boolean = False) As RectangleF Dim elemPos As ElementPosition, rectPix As RectangleF Select Case theChartElement.GetType.Name Case "ChartArea" Dim charta As ChartArea = theChartElement If iPlot Then elemPos = charta.InnerPlotPosition Else elemPos = charta.Position End If Case "Title" Dim titel As Title = theChartElement elemPos = titel.Position Case "Legend" Dim legende As Legend = theChartElement elemPos = legende.Position End Select rectPix = New RectangleF(elemPos.X, elemPos.Y, elemPos.Width, elemPos.Height) rectPix = e.ChartGraphics.GetAbsoluteRectangle(rectPix) Return rectPix End Function
Aufrufbeispiel:
Es wird eine Checkbox nach rechts an der Chartarea und nach unten an dem Chart-Titel (der wiederum oben links im Chart angeordnet ist) ausgerichtet.
Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal e As ChartPaintEventArgs) _ Handles Chart1.PostPaint Dim rt As RectangleF = getChartElementPositionInPixel(e, Chart1, _ Chart1.ChartAreas(0), True) Dim ra As RectangleF = getChartElementPositionInPixel(e, Chart1, _ Chart1.Titles(0)) CheckBox1.Location = _ New Point(rt.Right - CheckBox1.Width - _ Chart1.ChartAreas(0).AxisY2.MajorTickMark.Size, ra.Bottom - CheckBox1.Height) End Sub