c# WinForm中不寻常的拖拽问题
本文关键字:问题 不寻常 WinForm | 更新日期: 2023-09-27 18:18:44
我有一个可以由用户拖动的PictureBox。当拖动完成后,组件看起来像在不断地从一边移动到另一边,就像在振动一样。
你的代码不太符合逻辑。上面写着:如果用户向下拖动一个像素,那么这个音符就会向下移动一步。如果鼠标向一侧移动,则鼠标每移动一个像素,音符就向下移动一步。
我建议回到概念上来。
- 首先需要确定鼠标距离:
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
。
你看,尽管用户拖拽了34个像素,但此时笔记正好在其原始位置上方30个像素。
像你的代码中那样的重复经常会导致错误,并且很难调整它们,所以总是寻找更好的算法。