/// <summary> /// уточнить цену /// </summary> private float RefinePrice(CandleChartControl chart, PointD worldCoords) { var price = (float) worldCoords.Y; if (RefineType == PriceRefineType.КакЕсть) return price; var candleIndex = (int) (worldCoords.X + 0.5); if (candleIndex < 0 || candleIndex >= chart.chart.StockSeries.DataCount) return price; var candle = chart.chart.StockSeries.Data.Candles[candleIndex]; if (RefineType == PriceRefineType.Закрытия) return candle.close; var deltas = new [] { Math.Abs(candle.open - price), Math.Abs(candle.high - price), Math.Abs(candle.low - price), Math.Abs(candle.close - price) }; var minIndex = deltas.IndexOfMin(); return minIndex == 0 ? candle.open : minIndex == 1 ? candle.high : minIndex == 2 ? candle.low : candle.close; }
private void DrawCommentForSelected(Graphics g, RectangleD worldRect, Rectangle canvasRect, PenStorage pens, BrushesStorage brushes) { if (string.IsNullOrEmpty(Comment)) return; var commentBox = new ChartComment { Color = LineColor, ColorFill = ShapeFillColor, Text = Comment, HideArrow = true, FillTransparency = 160 }; var textRect = commentBox.GetCommentRectangle(g, worldRect, canvasRect); // прикинуть, куда лучше захреначить комментарий - в центр или в конец // спроецировать координаты курсора на линию var cursorPoint = Owner.Owner.PointToClient(Control.MousePosition); var screenPoints = linePoints.Select(p => Conversion.WorldToScreenF(p, worldRect, canvasRect)).ToList(); var pivot = Geometry.GetProjectionPointOnLine(cursorPoint, screenPoints[0], screenPoints[1]); // пробуем два варианта размещения - привязываем левый верхний или // правый нижний углы комментария, смотрим, какой вариант ближе к центру экрана var potentialPivots = new [] { new PointF(pivot.X, pivot.Y + textRect.Height/2), new PointF(pivot.X - textRect.Width, pivot.Y - textRect.Height/2) }; var cx = canvasRect.Left + canvasRect.Width / 2; var cy = canvasRect.Top + canvasRect.Height / 2; var bestPivotIndex = potentialPivots.IndexOfMin(p => (p.X - cx)*(p.X - cx) + (p.Y - cy)*(p.Y - cy)); pivot = potentialPivots[bestPivotIndex]; var worldPivotPoint = Conversion.ScreenToWorld(pivot, worldRect, canvasRect); commentBox.PivotPrice = worldPivotPoint.Y; commentBox.PivotIndex = worldPivotPoint.X; // таки нарисовать using (var fonts = new FontStorage(Owner.Owner.Owner.Font)) commentBox.DrawComment(g, fonts, worldRect, canvasRect, pens, brushes, new List<Rectangle>()); }