line - ZedGraph - 如何使水平线可拖动?

标签 line drag zedgraph

我有一些水平直线,希望用户能够垂直拖动。这怎么可能?我认为线选择的最佳参数是线附近固定数量的像素。因此,如果鼠标为 +/- 2 像素,我应该更改鼠标光标并使线条可拖动。我看到 CurveItem 类具有属性 IsSelectable 和 IsSelected。这些对解决这个问题有什么作用吗?通过阅读类文档,我无法真正理解它们的用途。


编辑:

FindNearestPoint(和FindNearestObject)似乎只搜索实际点。我将如何选择沿着直线的整个部分工作?我想我需要制作自己的自定义“查找”例程,循环遍历我要检查的所有行,并且对于每个计算它都是基于鼠标 X 位置的假想 Y 点 (? )为此,我也在考虑倾斜线,对于水平/垂直线,它会稍微简单一些。至少这似乎是 curveItem 所需要的,但我认为选择 LineObj(在其中间部分)也必须这样做?

我实际上并不知道 LineObj 的存在。似乎 LineObj 无法更改 X2/Y2 坐标,因为它们是 ReadOnly。那么是否可以拖动 LineObj 的 X2/Y2 点?


编辑 2:

这似乎是 JapaneseCandleStick 图表上 FindNearestPoint 的问题;当我在图表 Pane 中单击时,它不会返回最近柱的索引,但我相信它会选择具有最接近 Y 值的索引,无论在 x 轴上有多远这是。有时它在鼠标右侧,有时在鼠标左侧。这是它的工作方式吗?

我自己制作了这个自定义函数,所以我想它没问题。不过,如果能理解为什么 FindNearestPoint 会以这种方式运行,那就太好了。

这是 mouseDown 的代码:

   ' Find nearest curve point:
   Dim ciNearestCurve As CurveItem
   Dim iNearestCurve As Integer
   Dim b As Boolean = zgc.GraphPane.FindNearestPoint(mousePt, zgc.GraphPane.CurveList, ciNearestCurve, iNearestCurve)
   If b Then
       With ciNearestCurve(iNearestCurve)
           Debug.Print(Date.FromOADate(.X) & " " & .Y & " " & .Z)
       End With

最佳答案

dragging the points with mouse 上查看本教程.

如果您使用的是 LineObj 而不是曲线,请查看 FindNearestObject方法。

此外,如果您想为点击创建一些“敏感区域”,this method应该可以帮助您将以像素为单位的鼠标坐标转换为 Pane 比例坐标。

主要思想是:
- 订阅 MouseDownMouseUpMouseMove 事件
- 在 MouseDown 事件的处理程序中检查点击点是否靠近您要移动的曲线/图形对象
- 以与第一个链接示例中所示类似的方式进行更改

编辑
关于您的编辑:
假设您有一条包含两个点的水平曲线 myCurve。使用 FindNearestPoint 您可以找到最近的点击点包含该点的曲线。

所以你有:

// mousePt is where you clicked
CurveItem nearestCurve = null;
int nearestID = -1;

myPane.FindNearestPoint(mousePt, out nearestCurve, out nearestID);
if(nearestCurve!=null)
   // remember the curve somewhere. 

接下来处理 MouseMoveMouseUp 事件以确定您需要将曲线移动多少。您只需要知道 Y(或 Y2)方向的变化,因为曲线是水平的,您可能不想沿 X 轴移动它。

当您发现需要将曲线移动多少时 (dy),只需执行以下操作:

for(int i=0; i<nearestCurve.Points.Count; i++)
    nearestCurve.Points[i].Y += dy;

关于你的第二个问题,在 the documentation for LineObj.Location.Y2你有:

Note that the Y2 position is stored internally as a Height offset from Y.

Width/Height 属性可以很容易地设置,所以你可以这样做。

关于line - ZedGraph - 如何使水平线可拖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3830209/

相关文章:

regex - 批处理文件删除具有相同变量的行

netbeans - PhpStorm 中的多行移动和复制

html - 使在 Canvas 中绘制的图像可拖动/可调整大小?

c# - 合并多个点对列表

c# - ZedGraph 规模都搞砸了

c++ - 需要读取文本文件 C++ 中某些字符之间的文本

WPF对角线拖放

Javascript拖动对象

swing - JFreeChart选择多个点-鼠标拖动-套索-Java

c# - Zedgraph 缩放在某些系统上无法正常工作