画图用鼠标画一条线

本文关键字:一条 鼠标 | 更新日期: 2023-09-27 18:17:51

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

当鼠标向下时,保存用户点击的位置。

    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",每秒从图形中绘制/删除线条并刷新图形,但这有点疯狂。

有"正常"的方法吗?

谢谢

画图用鼠标画一条线

好的,我已经解决了这个问题,我会把答案贴出来给后代。

首先,我们需要在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. 当鼠标向上时,停止绘图过程(以避免改变"On mouse move"中的线)

如果有人真的要用它,需要更好的解释,请注释。