2011-12-20 8 views
1

私は、ユーザが上下にドラッグできるピクチャボックスを持っています。異常なドラッグの問題

問題のプログラムはピアノ用の複雑な音楽スタッフエディタであるため、スタッフのノートの移動を実現する唯一の方法は、if文の数を増やしたり、コーディネーションを変更することです。

問題は、ユーザーがPictureBoxコンポーネントを下に移動できないことですが、オブジェクトをドラッグすると何も起こりません。クラスはPictureBoxから継承されます。

PictureBoxが下にドラッグされたときには機能しますが、上にドラッグすると移動しないことを強調したいと思います。ドラッグは間隔で行われます。つまり、PictureBoxは特定の場所にしか配置できません(したがって、特定の座標の必要性)。

+0

(関連性がありません:「トップ」のチェック*が[番号の並び順](http://stackoverflow.com/a/3188857/71059)であれば読みやすくなります。同意しない) – AakashM

+2

スニペットは診断には不十分です。典型的な問題は、コントロールを動かすとマウスの相対位置も変わるということです。 –

+0

奇妙なことは、マウスを下に動かすと機能するということです。実際には完全に機能します。しかし、私はマウスを上に動かすと、それはdoesntです。そして、両方の状況でほぼ同じ正確なコードを使用しています。 –

答えて

1

現在のソリューションは時々動作しますが、コントロールをドラッグしてifステートメントで指定した座標にスナップすると、イベントが頻繁に呼び出されることがあります。

提案された解決策は:

私はあなたがドラッグするコントロールを含むフォームまたは親でMouseMoveイベントを使用することをお勧めします。値はハードコードされていなくても設定可能でなければなりません。 コードは少ししか変わらないでしょう(コントロールのLeftTopのプロパティの代わりに現在のマウス座標を比較しています)、正しく動作するはずです。

UPDATE:

それは今あなたが3ヶ所(Yのいずれかにコントロールを配置できるようにする、またはに等しく働くので、私は、あなたのコードを修正しました158)。私はあなたに多くのコードを変更する必要がないようにちょっと変えますが、最初に述べた方法を使うことを強くお勧めします:)。

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

返信いただきありがとうございます!あなたは「すばやく提案された解決策」について親切に教えていただけますか?あなたが何を意味しているか正確に理解しているかどうかはわかりませ –

+0

これを試しても、まだこの問題があります。 –

+0

ルーカスのおかげで、残念ながら、これはどちらもうまくいきませんでした。これはおそらくPictureBoxクラスの不具合に終わっているでしょう。私はまだ努力のためにあなたの答えをマークします - 多分それは将来他の誰かを助けるでしょう。どうもありがとう! –

関連する問題