拖拽钢琴五线谱的组成部分(音符)

本文关键字:音符 组成部分 钢琴 五线谱 | 更新日期: 2023-09-27 18:18:24

我有一个Picturebox,用户可以向上或向下拖动它。PictureBox代表钢琴五线谱上的一个音符。当音符向上或向下移动时,音符的位置将相对于五线谱线发生变化。因此,位置只能移动到固定位置(y值)。因此,当用户垂直移动一个音符时,它不应该被放置在任何地方,而只应该被放置在指定的位置(由if语句决定)。

问题是用户能够向下移动PictureBox(音符)组件,但是当对象被向上拖动时,什么也没有发生。类继承自PictureBox。

我只是想强调一下,当向下拖动时,PictureBox可以工作,但是当向上拖动时,它不会移动。拖拽是间隔完成的,也就是说,PictureBox只能被放置在特定的位置(因此需要特定的坐标)。

拖拽钢琴五线谱的组成部分(音符)

您的代码失败,因为向上移动时的if语句包含当前位置。例:当……顶部是138,鼠标向上移动,你会点击if语句:else if (this.Top < 148 && this.Top >= 138),这将设置顶部为138,它已经是。您应该像这样将=符号移到另一边:if (this.Top <= 148 && this.Top > 138) .

与其使用大量if语句创建允许的Y坐标列表,不如在笔记移动时遍历列表,直到找到最接近的允许坐标并移动到那里。如下所示:

List<int> AllowedYs;
// TODO: Add coordinates to your list
var FinalY = AllowedYs.OrderBy(y => Math.Abs(y - e.Y)).First();