2013-04-05 132 views
1

我正在使用Zedgraph创建股票图表应用程序。该图表有多个指标面板。我想显示一个十字光标,该光标延伸到包含所有图形窗格的Zedgraph控件的范围。我使用下面的代码和MouseMove事件完成了一半的工作。但是,当鼠标停止移动时,十字准线消失。当鼠标静止时,我如何让它们显示?我的Zedgraph控件在下面的代码中被命名为'chtOHLC'。如何在Zedgraph中绘制延长的十字光标,当鼠标未移动时该光标持续存在?

#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

试一下: 它添加到您的窗体类

ZedGraph这里是我的图书馆

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

ZedGraph鼠标移动事件的instanse:

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(); 
      } 
     } 

我觉得你的问题在perfomance。 LineObj更快然后图形