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 所有代码,但会解释步骤:
- 向您的 class 添加成员:
private LineObj mCurrentLine;
- 鼠标按下时创建一行
mCurrentLine = new LineObj(Color.Red, mMouseDownX, mMouseDownY, mMouseDownX, mMouseDownY);
- 鼠标移动时改变直线 X2,Y2 坐标
mCurrentLine.Location.X2 = x;
- 在鼠标松开时停止绘图过程(以避免更改 "on mouse move"
中的行
如果有人真的要使用它,并且需要更好的解释,请发表评论。
我写了一个用鼠标画线的代码。
鼠标按下时,我会保存用户点击的位置。
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 所有代码,但会解释步骤:
- 向您的 class 添加成员:
private LineObj mCurrentLine;
- 鼠标按下时创建一行
mCurrentLine = new LineObj(Color.Red, mMouseDownX, mMouseDownY, mMouseDownX, mMouseDownY);
- 鼠标移动时改变直线 X2,Y2 坐标
mCurrentLine.Location.X2 = x;
- 在鼠标松开时停止绘图过程(以避免更改 "on mouse move" 中的行
如果有人真的要使用它,并且需要更好的解释,请发表评论。