Zedgraph用鼠标绘制一条线

时间:2015-10-15 21:04:12

标签: c# zedgraph

我写了一个代码来使用鼠标绘制一条线。

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

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

问题是当鼠标停机时,用户看不到该行(因为我只在“向上”事件中绘制它。)

我该如何解决?

从技术上讲,我可以使用“悬停”并每秒从图形中绘制/删除线条并刷新图形,但这有点疯狂。

有没有“正常”的方式来做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了问题,我将为后代发布答案。

首先,我们需要对zedgraph代码进行微小的更改,以允许自己在创建后更改行,这可能会破坏创建者试图实现的一些“不可变”范例,但是如果你想避免创建并且每次鼠标移动时都删除行。

在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; }
    }

从这里很容易,我不会发布所有代码,但会解释步骤:

  1. 在您的班级中添加会员:private LineObj mCurrentLine;
  2. 在鼠标按下时创建一行mCurrentLine = new LineObj(Color.Red, mMouseDownX, mMouseDownY, mMouseDownX, mMouseDownY);
  3. 在鼠标移动时更改线X2,Y2坐标mCurrentLine.Location.X2 = x;
  4. 在鼠标上方停止绘图过程(以避免更改“鼠标移动”中的行
  5. 如果有人真正要使用它,并需要更好的解释,请发表评论。