c# WinForm中不寻常的拖拽问题

本文关键字:问题 不寻常 WinForm | 更新日期: 2023-09-27 18:18:44

我有一个可以由用户拖动的PictureBox。当拖动完成后,组件看起来像在不断地从一边移动到另一边,就像在振动一样。

c# WinForm中不寻常的拖拽问题

你的代码不太符合逻辑。上面写着:如果用户向下拖动一个像素,那么这个音符就会向下移动一步。如果鼠标向一侧移动,则鼠标每移动一个像素,音符就向下移动一步。

我建议回到概念上来。

  • 首先需要确定鼠标距离:delta = e.Y - currentY .
  • 然后,将其捕获到网格中:gridDelta = delta / step * step,其中step在您的情况下为10。

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

    delta / step * step是必需的,因为从一个音调到另一个音调的距离是10,即如果它移动一个音调,音符应该出现在其原始位置以上10个像素。

  • 下一步,添加gridDeltathis.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

你看,尽管用户拖拽了34个像素,但此时笔记正好在其原始位置上方30个像素。

像你的代码中那样的重复经常会导致错误,并且很难调整它们,所以总是寻找更好的算法。