/// <summary> /// カーソルを更新します。 /// </summary> /// <param name="mouse">マウス座標</param> /// <param name="result">ヒットテストの結果</param> /// <param name="x">x座標</param> /// <param name="max_x">最大x座標</param> /// <param name="format">価格表示のフォーマット</param> public virtual void UpdateCursors(Point mouse, HitTestResult result, int x, int max_x, string format) { if (result.ChartArea == this) { // マウスが自エリア内の場合 // カーソル CursorX.SetCursorPixelPosition(mouse, false); CursorY.SetCursorPixelPosition(mouse, false); // カーソルラベルY CursorLabelY.Text = AxisY2.PixelPositionToValue(mouse.Y).ToString(format); CursorLabelY.Top = mouse.Y - CursorLabelY.Height / 2; if (AxisX.ScaleView.Position + AxisX.ScaleView.Size > max_x) { CursorLabelY.Left = (int)(AxisX.ValueToPixelPosition(AxisX.ScaleView.Position + AxisX.ScaleView.Size) + 1); } else { CursorLabelY.Left = (int)(AxisX.ValueToPixelPosition(AxisX.ScaleView.Position + AxisX.ScaleView.Size + 1) + 1); } CursorLabelY.Visible = true; } else { // マウスが他エリア内の場合 // カーソル CursorY.Position = double.NaN; // カーソルラベルY CursorLabelY.Visible = false; } }
// 如果上一次的视图和当前XY轴范围不匹配则取消缩放视图 private void CancelScaleViewIfRangeNotFit(double lastMaxX, double lastMinX, double lastMaxY, double lastMinY) { if (!AxisX.IsZoomed && !AxisY.IsZoomed) { return; } double currentMaxX = AxisX.Maximum; double currentMinX = AxisX.Minimum; double currentMaxY = AxisY.Maximum; double currentMinY = AxisY.Minimum; // double viewMaxX = plotArea.AxisX.ViewMaximum; // double viewMinX = plotArea.AxisX.ViewMinimum; // double viewMaxY = plotArea.AxisY.ViewMaximum; // double viewMinY = plotArea.AxisY.ViewMinimum; // 如果没有重合区域则取消缩放 if (double.IsNaN(lastMaxX) || double.IsNaN(lastMinX) || double.IsNaN(lastMaxY) || double.IsNaN(lastMinY) || double.IsNaN(currentMaxX) || double.IsNaN(currentMinX) || double.IsNaN(currentMaxY) || double.IsNaN(currentMinY) || currentMaxX <= lastMinX || currentMinX >= lastMaxX || currentMaxY <= lastMinY || currentMinY >= lastMaxY) { AxisX.CancelScaleView(); AxisX2.CancelScaleView(); AxisY.CancelScaleView(); AxisY2.CancelScaleView(); } double currentXRange = currentMaxX - currentMinX; double currentYRange = currentMaxY - currentMinY; double lastXRange = lastMaxX - lastMinX; double lastYRange = lastMaxY - lastMinY; double minXRange = currentXRange > lastXRange ? lastXRange : currentXRange; double minYRange = currentYRange > lastYRange ? lastYRange : currentYRange; // 如果X轴范围差比例超过最大维持系数则取消XY轴的缩放 if (Math.Abs(currentXRange - lastXRange) / minXRange > Constants.MaxDiffToKeepXScaleview) { AxisX.CancelScaleView(); AxisX2.CancelScaleView(); AxisY.CancelScaleView(); AxisY2.CancelScaleView(); } // 如果Y轴范围差比例超过最大维持系数则取消Y轴的缩放 else if (Math.Abs(currentYRange - lastYRange) / minYRange > Constants.MaxDiffToKeepYScaleview) { AxisY.CancelScaleView(); AxisY2.CancelScaleView(); } }
/// <summary> /// カーソルを更新します。 /// </summary> /// <param name="mouse">マウス座標</param> /// <param name="result">ヒットテストの結果</param> /// <param name="x">x座標</param> /// <param name="max_x">最大x座標</param> /// <param name="format">価格表示のフォーマット</param> public override void UpdateCursors(Point mouse, HitTestResult result, int x, int max_x, string format) { base.UpdateCursors(mouse, result, x, max_x, format); // カーソルラベルX CursorLabelX.Text = Candles[x].DateTime.ToShortDateString(); CursorLabelX.Left = mouse.X - CursorLabelX.Width / 2; CursorLabelX.Top = (int)(AxisY2.ValueToPixelPosition(AxisY2.ScaleView.Position) + 1 + AxisY2.ScrollBar.Size); // 価格表示板 DataTypes.Candle prev = null; if (x > 0) { prev = Candles[x - 1]; } PriceBoard.SetCandle(Candles[x], prev, format); }