2011-10-17 14 views
1

私はwinformsアプリケーションを持っています。内部には、1つのパネル(panel1)があり、このパネルの内側にボタンがある別のパネル(panel2)があります。 私はいくつかのボタンでマウスをかぶったときにpanel2を水平方向に動かしたいと思っています。 私はpanel2の各ボタンでこれを作っています。MouseMoveイベントでパネルを水平に移動

this.button4.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btMouseDown); 
     this.button4.MouseMove += new System.Windows.Forms.MouseEventHandler(this.btMouseMove); 
     this.button4.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btMouseUp); 

void btMouseMove(object sender, MouseEventArgs e) 
    { 
     if (_mouseDown) 
      panel2.Location = PointToClient(this.panel2.PointToScreen(new Point(e.X - _mousePos.X, e.Y - _mousePos.Y)));    
    } 
    void btMouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      _mouseDown = true; 
      _mousePos = new Point(e.X, e.Y); 
     } 
    } 
    void btMouseUp(object sender, MouseEventArgs e) 
    { 
     if (_mouseDown) 
     { 
      _mouseDown = false; 
     } 
    } 

このコードは、パネル1の内側に正しくpanel2を移動し、私は水平方向にのみパネルを移動したい、そしてこのコードは、マウスの場所に移動します。私が代わりに

Point(e.X - _mousePos.X, e.Y - _mousePos.Y) 

Point(e.X - _mousePos.X, 3) 

を入れてみました。しかしpanel2が消えます。私はパネル1を水平方向に動かす方法を知りたいです。

ありがとうございます。

+0

は、パネルが消える:(あなたが実際に移動したいん何 – uoah

+0

を今あなたがパネル1、ないpanel2を移動している、作品ではありません –

+0

申し訳ありませんが、悪いペースト、私インチソースコードpanel1はこの例ではpanel2です – uoah

答えて

4
void btMouseMove(object sender, MouseEventArgs e) { 
     if (_mouseDown) { 
      int deltaX = e.X - _mousePos.X; 
      int deltaY = e.Y - _mousePos.Y; 
      panel2.Location = new Point(panel2.Left + deltaX, panel2.Top /* + deltaY */); 
     } 
    } 
+0

パーフェクト!必要に応じて動作します!ありがとうございます – uoah

0

これはクリーンな実装ではありませんが、私はあなたがやろうとしているものを正しく理解すれば、それは動作します:

 int _x = 0; 

    private void button1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if(_x == 0) 
     { 
      _x = e.X; 
     } 

     int move = 0; 
     Point p; 

     if (e.X <= _x) 
     { 
      move = _x - e.X; 
      p = new Point(panel2.Location.X - move, panel2.Location.Y); 
     } 
     else 
     { 
      move = e.X - _x; 
      p = new Point(panel2.Location.X + move, panel2.Location.Y); 
     } 

     panel2.Location = p; 
    } 
+0

面白いですが、うまく動作しますが、最初の答えが好きです。 – uoah

0

移動させながら、あなたはpanel2の現在の位置を考慮して必要があります。デルタだけが必要なので、クライアントとスクリーンのコーディネートの間でマウスの位置を変換する必要はありません。

さらに、ユーザーが物をドラッグできるようにする場合、ドラッグが小さなしきい値を超えない限り、パネルを移動しないことを強くお勧めします。誤ってマウスを数ピクセル動かすと、画面上をクリックするのが非常に簡単です。例えば

:?

if (delta > 3) { // only drag if the user moves the mouse over 3 pixels 
    panel2.Location = ... 
} 
関連する問題