2011-10-17 39 views
1

我有一個winforms應用程序。在裏面,我有一個面板(面板1),在面板內部還有另一個面板(面板2),裏面有按鈕。 當我在某個按鈕中輸入內容時,我想在panel1內水平移動panel2。 我在panel2內的每個按鈕中都做了這個。c#使用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; 
     } 
    } 

此代碼正確移動是Panel2的PANEL1裏面,但我想在面板只有水平移動,而這種代碼移動到鼠標位置。我試圖把

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

而不是

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

不過是Panel2消失。我想知道如何僅在水平方向移動面板1內的面板2。

非常感謝。

+0

不工作,面板消失:( – uoah

+0

什麼你真的想移動現在你移動PANEL1,不 –

+0

不好意思,不好貼是Panel2,在我的? sourcecode 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 = ... 
}