【问题标题】:Component (note) dragging on a piano staff拖动钢琴五线谱的组件(音符)
【发布时间】:2011-12-23 23:03:00
【问题描述】:

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

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

我想强调的是,PictureBox 在向下拖动时可以工作,但在向上拖动时不会移动。拖动是间隔进行的,即 PictureBox 只能放置在某些地方(因此需要特定的坐标)。

【问题讨论】:

    标签: c# .net winforms picturebox


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      与其使用大量的 if 语句创建一个允许的 Y 坐标列表,然后每当音符移动时,遍历列表直到找到最接近的允许坐标并移动到那里。如下所示:

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

      【讨论】:

      • 谢谢,但这不是我的问题。
      • 那是什么?我给了你一个答案,可以让你做你想做的事。
      • 音符的移动。正如我所说,音符在向下移动时有效,但在向上移动时无效。所以这很可能与 PictureBox 有关。 if 语句现在只是暂时的
      • 每次 e.Y 更改时应用我的代码,你会得到你想要的。
      • 错误可能出在 if 语句的逻辑中(可能需要在你向上移动的一半中颠倒它们的顺序或其他东西),如果你使用我的代码,它应该是更容易理解,如果您仍有问题,我会尝试解决问题
      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多