2011-12-20 21 views
1

我有一个PictureBox,用户可以向上或向下拖动。不寻常的拖动问题

有问题的程序是一个复杂的音乐钢琴工作人员的编辑,因此实现工作人员笔记的移动的唯一方法是通过一些if语句和修改坐标。

问题是用户无法移动PictureBox组件,但是当对象被拖动时,什么都不会发生。该类继承自PictureBox。

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

+0

(无关:我会发现你的'顶部'检查*更容易阅读,如果他们在[数行顺序](http://stackoverflow.com/a/3188857/71059) - 你可能或可能不同意) – AakashM 2011-12-20 17:42:09

+2

这段代码不够好来诊断它。典型的问题是移动控件也会改变鼠标的相对位置。 – 2011-12-20 17:44:45

+0

奇怪的是,当我向下移动鼠标时,它可以正常工作 - 它实际上完美地工作。但是当我将鼠标移开时,它没有。即时消息使用几乎相同的确切代码适用于这两种情况。 – 2011-12-20 17:46:49

回答

1

您的当前解决方案有时可能会有效,但是当您尝试拖动控件并将其对齐回到您在if语句中指定的坐标时,可能会经常调用该事件。

建议解决方案:

我建议你在包含要拖动控制形式或家长使用MouseMove事件。这些值也应该是可配置的,而不是硬编码的。 代码只会改变一点(比较当前的鼠标坐标而不是控件的LeftTop属性),它应该可以正常工作。

UPDATE:

我已经纠正了你的代码,因此它现在的作品可以让你把一个控制在三个地方之一(Ÿ等于,或)。我只改变了一点,不要求你改变很多代码,但我强烈建议你使用第一种方法描述:)。

int currentY; 
    bool isDragging = false; 

    private void OnDrag(object sender, MouseEventArgs e) 
    { 
     if (isDragging) 
     { 
      //calculate Y position relative to parent 
      int parentY = this.Top + e.Y; 

      if (parentY < currentY) 
      { 
       if (parentY > 158 && parentY >= 148) 
       { 
        if (this.Top != 148) 
        { 
         currentY += (this.Top - 148); 
         this.Top = 148; 
        } 
       } 
       else if (parentY < 148 /*&& parentY >= 138*/) 
       { 
        if (this.Top != 138) 
        { 
         currentY += (this.Top - 138); 
         this.Top = 138; 
        } 
       } 

       //And so on 

      } 
      else if (parentY > currentY) 
      { 
       if (/*parentY <= 158 &&*/ parentY >= 148) 
       { 
         currentY += (this.Top - 158); 
         this.Top = 158; 
       } 
       else if (parentY < 148 && parentY >= 138) 
       { 
         currentY += (this.Top - 148); 
         this.Top = 148; 
       } 

       //And so on 

      } 
     } 
    } 

    public void MusicNote_MouseDown(object sender, MouseEventArgs e) 
    { 
     currentY = this.Top + e.Y; 

     this.Capture = true; 

     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      isDragging = true; 
     } 

     this.MouseMove += new MouseEventHandler(OnDrag); 
    } 

    public void MusicNote_MouseUp(object sender, MouseEventArgs e) 
    { 
     isDragging = false; 

     this.Capture = false; 

     this.MouseMove -= new MouseEventHandler(OnDrag); 
    } 

但是,以前的解决方案可能会更符合您的需求。

+0

感谢您的回复!您是否可以详细解释“快速建议的解决方案”?不知道我是否明白你的意思。 – 2011-12-20 20:40:29

+0

试过这个,仍然有这个问题。 – 2011-12-20 22:30:00

+0

感谢卢卡斯的援助,不幸的是这也没有奏效。这可能是由于PictureBox类的缺陷。我仍然会标记你的努力的答案 - 也许这将有助于未来的其他人。非常感谢! – 2011-12-23 09:47:43