Zedgraph 用鼠标画线

Zedgraph drawing a line with the mouse

我写了一个用鼠标画线的代码。

鼠标按下时,我会保存用户点击的位置。

    bool mZgc_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
    {
        GraphPane graphPane = mZgc.GraphPane;
        graphPane.ReverseTransform(e.Location, out mMouseDownX, out mMouseDownY);
        return false;
    }

鼠标移开我画线:

    bool zgc_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
    {
        GraphPane graphPane = mZgc.GraphPane;
        double x, y;

        graphPane.ReverseTransform(e.Location, out x, out y);
        LineObj threshHoldLine = new LineObj(Color.Red, mMouseDownX, mMouseDownY, x, y);
        graphPane.GraphObjList.Add(threshHoldLine);
        mZgc.Refresh();

        return false;
    }

问题是当鼠标按下时,用户看不到线条(因为我只在 "up" 事件上绘制它)。

我该如何解决?

从技术上讲,我可以每秒使用图表中的 "on hover" 和 draw/remove 线并刷新图表,但这有点疯狂。

有没有 "normal" 方法来做到这一点?

谢谢

好的,我已经解决了这个问题我会post为后代解答。

首先,我们需要对 zedgraph 代码做一个小改动,以允许我们在他们创建后更改行,这可能会打破一些 "immutable" 创作者试图实现的范例,但是如果你想要避免每次鼠标移动时都创建和删除行。

在文件 Location.cs 中编辑 X2、Y2 属性(缺少设置):

    public double X2
    {
        get { return _x+_width; }
        set { _width = value-_x; }
    }

    public double Y2
    {
        get { return _y+_height; }
        set { _height = value-_y; }
    }

从这里开始很简单,我不会 post 所有代码,但会解释步骤:

  1. 向您的 class 添加成员:private LineObj mCurrentLine;
  2. 鼠标按下时创建一行 mCurrentLine = new LineObj(Color.Red, mMouseDownX, mMouseDownY, mMouseDownX, mMouseDownY);
  3. 鼠标移动时改变直线 X2,Y2 坐标 mCurrentLine.Location.X2 = x;
  4. 在鼠标松开时停止绘图过程(以避免更改 "on mouse move"
  5. 中的行

如果有人真的要使用它,并且需要更好的解释,请发表评论。