1

我正在使用 Zedgraph 创建一个股票图表应用程序。该图表有多个指标窗格。我想显示一个十字光标,它延伸到包含所有图形窗格的 Zedgraph 控件的范围。我使用以下代码和 MouseMove 事件完成了一半的工作。然而,当鼠标停止移动时,十字准线消失。鼠标静止时如何保持显示?在下面的代码中,我的 Zedgraph 控件名为“chtOHLC”。

#region Extended Crosshairs
private Point _mousePoint;
private void chtOHLC_MouseMove(object sender, MouseEventArgs e)
{
  _mousePoint = new Point(e.X, e.Y);
  chtOHLC.Refresh();
}

private void chtOHLC_Paint(object sender, PaintEventArgs e)
{
  if (_mousePoint != null)
  {
    Graphics g = chtOHLC.CreateGraphics();
    g.DrawLine(Pens.Black, 0, _mousePoint.Y, chtOHLC.Width, _mousePoint.Y);
    g.DrawLine(Pens.Black, _mousePoint.X, 0, _mousePoint.X, chtOHLC.Height);
    g.Dispose();
  }
} 
#endregion
4

1 回答 1

5

试试看:将它添加到您的表单类

ZedGraph 这里是我的图书馆实例

 private double? CrossHairX = null;
 private double? CrossHairY = null;
 LineObj xHairOld = new LineObj();
 LineObj yHairOld = new LineObj();

ZedGraph 鼠标移动事件:

private void ZedGraph_MouseMove(object sender, MouseEventArgs e)
        {
            double x, y;
            ZedGraph.GraphPane.ReverseTransform(e.Location, out x, out y);

            #region crosshair

            if (x < ZedGraph.GraphPane.XAxis.Scale.Min ||
                x > ZedGraph.GraphPane.XAxis.Scale.Max ||
                y < ZedGraph.GraphPane.YAxis.Scale.Min ||
                y > ZedGraph.GraphPane.YAxis.Scale.Max
                )//out of the bounds
            {
                ZedGraph_MouseLeave(new object(), new EventArgs());
            }
            else//ok draw
            {

                if (CrossHairX != null && CrossHairY != null)
                {
                    ZedGraph.GraphPane.GraphObjList.Remove(xHairOld);
                    ZedGraph.GraphPane.GraphObjList.Remove(yHairOld);
                }

                LineObj xHair = new LineObj(ZedGraph.GraphPane.XAxis.Scale.Min, y, ZedGraph.GraphPane.XAxis.Scale.Max, y);
                LineObj yHair = new LineObj(x, ZedGraph.GraphPane.YAxis.Scale.Min, x, ZedGraph.GraphPane.YAxis.Scale.Max);

                ZedGraph.GraphPane.GraphObjList.Add(xHair);
                xHairOld = xHair;

                ZedGraph.GraphPane.GraphObjList.Add(yHair);
                yHairOld = yHair;

                CrossHairY = y;
                CrossHairX = x;


                ZedGraph.Refresh();
            }

            #endregion 
    }

和鼠标离开事件

 private void ZedGraph_MouseLeave(object sender, EventArgs e)
        {
            if (CrossHairX != null && CrossHairY != null)
            {
                ZedGraph.GraphPane.GraphObjList.Remove(xHairOld);
                ZedGraph.GraphPane.GraphObjList.Remove(yHairOld);
                ZedGraph.Refresh();
            }
        }

我认为你的性能问题。LineObj 比 Graphics 快

于 2013-06-20T15:32:08.240 回答