我有一个可以被用户拖动的PictureBox。拖动完成后,组件似乎从一侧到另一侧连续移动,就像振动一样。
答案 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个像素。
代码中的重复通常会导致错误并且很难对其进行调整,因此请始终寻找更好的算法。