Annotation GetHoveredAnnotation(Point mouseLocation)
 {
     foreach (Annotation annotation in Chart.AnnotationRepository)
     {
         PaneAnchorPoint anchorPoint = (PaneAnchorPoint)annotation.AnchorPoint;
         XYDiagram       diagram     = ((XYDiagram)Chart.Diagram);
         DateTime        argument    = (DateTime)anchorPoint.AxisXCoordinate.AxisValue;
         if ((DateTime)diagram.AxisX.VisualRange.MaxValue < argument || (DateTime)diagram.AxisX.VisualRange.MinValue > argument)
         {
             continue;
         }
         ControlCoordinates coords = diagram.DiagramToPoint((DateTime)anchorPoint.AxisXCoordinate.AxisValue,
                                                            (double)anchorPoint.AxisYCoordinate.AxisValue,
                                                            anchorPoint.AxisXCoordinate.Axis, anchorPoint.AxisYCoordinate.Axis, anchorPoint.Pane);
         if (coords.Visibility == ControlCoordinatesVisibility.Visible)
         {
             RelativePosition position = (RelativePosition)annotation.ShapePosition;
             Point            center   = new Point((int)(coords.Point.X + Math.Cos(position.Angle / 180 * Math.PI) * position.ConnectorLength),
                                                   (int)(coords.Point.Y - Math.Sin(position.Angle / 180 * Math.PI) * position.ConnectorLength));
             int diffX = Math.Abs(center.X - mouseLocation.X);
             int diffY = Math.Abs(center.Y - mouseLocation.Y);
             if (diffX <= annotation.Width / 2 && diffY <= annotation.Height / 2)
             {
                 return(annotation);
             }
         }
     }
     return(null);
 }
Example #2
0
        private void chartSelectRange_CustomPaint(object sender, CustomPaintEventArgs e)
        {
            if (Diagram == null)
            {
                return;
            }
            ControlCoordinates leftBottom = Diagram.DiagramToPoint(minRange,
                                                                   Convert.ToDouble(Diagram.AxisY.VisualRange.MinValue));
            ControlCoordinates leftTop = Diagram.DiagramToPoint(minRange,
                                                                Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue));
            ControlCoordinates rightTop = Diagram.DiagramToPoint(maxRange,
                                                                 Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue));

            ControlCoordinates leftZero = Diagram.DiagramToPoint(Convert.ToDateTime(Diagram.AxisX.VisualRange.MinValue),
                                                                 Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue));
            ControlCoordinates rightMax = Diagram.DiagramToPoint(Convert.ToDateTime(Diagram.AxisX.VisualRange.MaxValue),
                                                                 Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue));


            int width  = rightTop.Point.X - leftBottom.Point.X;
            int height = leftBottom.Point.Y - leftTop.Point.Y;

            SolidBrush highlight = new SolidBrush(Color.FromArgb(128, Color.LightGoldenrodYellow));

            e.Graphics.FillRectangle(highlight, leftZero.Point.X, leftZero.Point.Y,
                                     leftTop.Point.X - leftZero.Point.X - 1, height);
            e.Graphics.FillRectangle(highlight, leftTop.Point.X + width + 1, leftTop.Point.Y,
                                     rightMax.Point.X - rightTop.Point.X - 1, height);
        }
        // Clip crosshair lines into a diagram.
        #region #ClipCrosshairLines
        void ClipCrosshairLines()
        {
            ControlCoordinates coordinatesTopLeft     = GetTopLeftCoordinates();
            ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates();
            RectangleGeometry  geometry = new RectangleGeometry();

            geometry.Rect = new Rect(coordinatesTopLeft.Point, coordinatesBottomRight.Point);
            crosshairCursorCanvas.Clip = geometry;
        }
        protected void PlaceValuesOnAxis(double x, double y)
        {
            ControlCoordinates coordinatesTopLeft     = GetTopLeftCoordinates();
            ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates();

            Canvas.SetLeft(valueX, x);
            Canvas.SetTop(valueX, coordinatesBottomRight.Point.Y);
            Canvas.SetLeft(valueY, coordinatesTopLeft.Point.X);
            Canvas.SetTop(valueY, y);
        }
        private void UpdateCrosshairPosition()
        {
            ClipCrosshairLines();
            currentXPosition = GetXPosition();
            double             seriesValue        = GetSeriesValue(series, currentXPosition);
            ControlCoordinates controlCoordinates = diagram.DiagramToPoint(currentXPosition, seriesValue);

            SetNumbersToValuePads(seriesValue.ToString("F2"));
            PlaceValuesOnAxis(controlCoordinates.Point.X, controlCoordinates.Point.Y);
            SetCrosshairVisibility(Visibility.Visible);
            Canvas.SetLeft(verticalLine, controlCoordinates.Point.X);
            Canvas.SetTop(horizontalLine, controlCoordinates.Point.Y);
        }
        private void ChartMouseMove(object sender, MouseEventArgs e)
        {
            if (!IsEnabled || !series.Visible)
            {
                SetCrosshairVisibility(Visibility.Collapsed);
                return;
            }
            // Clip crosshair lines within a diagram bounds.
            ClipCrosshairLines();

            // Get the current cursor position and transform it to the diagram coordinates.
            Point position = e.GetPosition(chart);
            DiagramCoordinates diagramCoordinates =
                diagram.PointToDiagram(position);

            if (!diagramCoordinates.IsEmpty)
            {
                // Get a value of a series point that is nearest to the current cursor position.
                double seriesValue = GetSeriesValue(series,
                                                    diagramCoordinates.DateTimeArgument);

                if (!double.IsNaN(seriesValue))
                {
                    // Specify the text for X and Y crosshair labels.
                    valueX.Text = (diagramCoordinates.DateTimeArgument).
                                  ToString("D", CultureInfo.CurrentCulture);
                    valueY.Text = Math.Round(seriesValue, 2).
                                  ToString(CultureInfo.CurrentCulture);

                    // Show the crosshair cursor elements.
                    SetCrosshairVisibility(Visibility.Visible);

                    // Convert chart coordinates to screen coordinates to
                    // place crosshair labels along the scale.
                    ControlCoordinates controlCoordinates =
                        diagram.DiagramToPoint(diagramCoordinates.
                                               DateTimeArgument, seriesValue);
                    PlaceValuesOnAxis(position.X, controlCoordinates.Point.Y);

                    // Draw the crosshair cursor.
                    Canvas.SetLeft(verticalLine, position.X);
                    Canvas.SetTop(horizontalLine, controlCoordinates.Point.Y);
                }
            }
            else
            {
                // Hide the crosshair cursor elements.
                SetCrosshairVisibility(Visibility.Collapsed);
            }
        }
        private void PlaceValuesOnAxis(double x, double y)
        {
            if (!IsEnabled || !series.Visible)
            {
                return;
            }
            ControlCoordinates coordinatesTopLeft     = GetTopLeftCoordinates();
            ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates();

            Canvas.SetLeft(valueX, x);
            Canvas.SetTop(valueX, coordinatesBottomRight.Point.Y);
            Canvas.SetLeft(valueY, coordinatesTopLeft.Point.X);
            Canvas.SetTop(valueY, y);
        }
        private void ClipCrosshairLines()
        {
            if (!IsEnabled || !series.Visible)
            {
                return;
            }
            ControlCoordinates coordinatesTopLeft     = GetTopLeftCoordinates();
            ControlCoordinates coordinatesBottomRight =
                GetBottomRightCoordinates();
            RectangleGeometry geometry = new RectangleGeometry();

            geometry.Rect = new Rect(coordinatesTopLeft.Point,
                                     coordinatesBottomRight.Point);
            crosshairCursorCanvas.Clip = geometry;
        }
Example #9
0
        void chartControl1_CustomPaint(object sender, CustomPaintEventArgs e)
        {
            DiagramCoordinates coords = Diagram.PointToDiagram(new Point(x, y));

            if (coords.IsEmpty || chart.Series[0].Points.Count == 0)
            {
                return;
            }

            SeriesPoint nearestPoint = chart.Series[0].Points[0];

            foreach (SeriesPoint point in chart.Series[0].Points)
            {
                if (point.NumericalArgument == coords.NumericalArgument)
                {
                    nearestPoint = point;
                    break;
                }
                else if (Math.Abs(nearestPoint.NumericalArgument - coords.NumericalArgument) > Math.Abs(point.NumericalArgument - coords.NumericalArgument))
                {
                    nearestPoint = point;
                }
            }

            ControlCoordinates pointCoords = Diagram.DiagramToPoint(nearestPoint.NumericalArgument, nearestPoint.Values[0]);
            ControlCoordinates leftBottom  = Diagram.DiagramToPoint(AxisXRange.MinValueInternal, AxisYRange.MinValueInternal);
            ControlCoordinates rightTop    = Diagram.DiagramToPoint(AxisXRange.MaxValueInternal, AxisYRange.MaxValueInternal);

            e.Graphics.DrawLine(Pens.Black, new Point(leftBottom.Point.X, pointCoords.Point.Y), new Point(rightTop.Point.X, pointCoords.Point.Y));
            e.Graphics.DrawLine(Pens.Black, new Point(pointCoords.Point.X, rightTop.Point.Y), new Point(pointCoords.Point.X, leftBottom.Point.Y));
            Rectangle markerRect = new Rectangle(pointCoords.Point.X - markerSize, pointCoords.Point.Y - markerSize, 2 * markerSize, 2 * markerSize);

            e.Graphics.FillEllipse(Brushes.Red, markerRect);
            e.Graphics.DrawEllipse(Pens.Black, markerRect);

            string    text     = "(" + nearestPoint.NumericalArgument.ToString() + ", " + nearestPoint.Values[0].ToString() + ")";
            SizeF     textSize = e.Graphics.MeasureString(text, Font);
            Rectangle rect     = new Rectangle(pointCoords.Point.X + markerSize, pointCoords.Point.Y + markerSize, (int)Math.Ceiling(textSize.Width), (int)Math.Ceiling(textSize.Height));

            e.Graphics.FillRectangle(Brushes.White, rect);
            e.Graphics.DrawRectangle(Pens.Black, rect);
            e.Graphics.DrawString(text, Font, Brushes.Black, rect);
        }