C#WinForm中不寻常的拖动问题

时间:2011-12-21 20:58:16

标签: c# .net winforms drag-and-drop picturebox

我有一个可以被用户拖动的PictureBox。拖动完成后,组件似乎从一侧到另一侧连续移动,就像振动一样。

1 个答案:

答案 0 :(得分:2)

您的代码不合逻辑。它说:如果用户将音符向下拖动一个像素,则音符设置为向下一步。如果鼠标然后向侧面移动,则对于鼠标移动的每个像素,笔记向下移动一步。

我建议回到概念。

  • 首先,必须确定鼠标距离:delta = e.Y - currentY
  • 然后,将其捕捉到网格中:gridDelta = delta / step * step,其中step为10。

    delta / step表示音符移动的音调数。因为我们使用的是整数,所以这个值是四舍五入的,我们只有整个音调。如果鼠标向上移动10(=步)像素,则选择下一个更高的音调。

    需要

    delta / step * step,因为从一个音调到另一个音调的距离是10,即如果音符高出一个音调,音符应该比其原始位置高10个像素。

  • 接下来,将gridDelta添加到this.Top并检查结果是否在范围内。
  • 最后,将值保存到this.Top

也许数字更清晰:如果用户在位置Y = 14处按下鼠标按钮,然后将其拖动到48,然后释放,则在OnDrag的最后一次调用中发生以下情况:

  • delta = 48 - 14 - delta是34。
  • gridDelta = 34 / 10 * 10 - 34/10 = 3; 3 * 10 * 30 - 所以gridDelta是30。
  • newTop = this.Top + 30
  • 检查newTop是否在范围内,然后将其分配给this.Top

你看,然后笔记正好在其原始位置上方30个像素,尽管用户将其拖动了34个像素。

代码中的重复通常会导致错误并且很难对其进行调整,因此请始终寻找更好的算法。