2010-04-24 79 views
3

我想要獲得一個控件,以便在用戶單擊並拖動控件時跟隨光標。問題是:1)控制器不能進入鼠標的位置; 2)控制器閃爍並飛到了所有的地方。我嘗試了一些不同的方法來做到這一點,但迄今爲止都失敗了。C# - 將控件移動到鼠標的位置

我已經試過:

protected override void OnMouseDown(MouseEventArgs e) 
{ 
    while (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
      this.Location = e.Location; 
    } 
} 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    while (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
      this.Location = e.Location; 
     } 
} 

但無論這些工作。任何幫助表示讚賞,並提前致謝!

回答

9

這裏是如何做到這一點:

private Point _Offset = Point.Empty; 

protected override void MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     _Offset = new Point(e.X, e.Y); 
    } 
} 

protected override void MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Offset != Point.Empty) 
    { 
     Point newlocation = this.Location; 
     newlocation.X += e.X - _Offset.X; 
     newlocation.Y += e.Y - _Offset.Y; 
     this.Location = newlocation; 
    } 
} 

protected override void MouseUp(object sender, MouseEventArgs e) 
{ 
    _Offset = Point.Empty; 
} 

_Offset這裏用於兩個目的:保持跟蹤在老鼠上的控制,當你開始點擊它,並且還保留是否鼠標按鈕的軌道是否關閉(這樣,當鼠標光標移過去並且按鈕沒有關閉時,控件不會被拖動)。

你絕對想在此代碼切換if s到while S,因爲它有所作爲。

+0

我已經試過這拖的路徑移動,它不會有所作爲。我欣賞儘管。 – 2010-04-24 04:12:46

+3

+1:MusiGenesis的代碼對我來說就像一個魅力,但有一點修改:我創建了一個新的用戶控件 - >重寫三個方法OnMouseDown,OnMouseUp和OnMouseMove - >每個方法的第一行是調用基本方法,即base.OnMouseDown(e),base.OnMouseMove(e)和base.OnMouseUp(e)。 - 其餘代碼隨着MusiGenesis討論。 – 2010-04-24 04:41:29

+1

非常感謝!這個新的答案就像一個魅力!我真的很感激它! – 2010-04-24 04:49:44

2

有在回答1個 1.設置鼠標處理程序,以控制錯誤,不形成像 button1_MouseMove 2.do不能使用該載體,但是您的控制,而不是(點newlocation = button1.Location) 3你不需要重載處理程序。

在我的測試後,這些改變按鈕(或其他控件)移動正常。

Chigook

0
private Point ptMouseDown=new Point(); 


protected override void MouseDown(object sender, MouseEventArgs e) 

{ 

    if (e.Button == MouseButtons.Left) 

    { 

     ptMouseDown = new Point(e.X, e.Y); 

    } 
} 

protected override void MouseMove(object sender, MouseEventArgs e) 
{ 

    if (_Offset != Point.Empty) 

    { 

     Pointf[] ptArr=new Pointf[]{this.Location}; 
     Point Diff=new Point(e.X-ptMouseDown.X,e.Y-ptMouseDown.Y); 
     Matrix mat=new Matrix(); 
     mat.Translate(Diff.X,Diff.Y); 
     mat.TransFromPoints(ptArr); 
     this.Location=ptArr[0]; 
    } 
} 

    enter code here 



protected override void MouseUp(object sender, MouseEventArgs e) 

{ 

    _Offset = Point.Empty; 

} 
1

嘗試此根據鼠標的位置和下面給出的代碼移動的對象是收集鼠標的移動路徑,並保存在數組列表的位置,以獲得路徑,其中鼠標點正在移動。你必須在全局聲明數組列表。

private void panel1_MouseMove(object sender, MouseEventArgs e) 
     { 



       if (e.Button == MouseButtons.Left) 
       { 
        ArrayList inList = new ArrayList(); 
        inList.Add(e.X); 
        inList.Add(e.Y); 
        list.Add(inList); 
       } 

     } 

當用戶點擊按鈕控件在用戶在屏幕

private void button1_Click_2(object sender, EventArgs e) 
    { 
     foreach (ArrayList li in list) 
      { 



       pic_trans.Visible = true; 
       pic_trans.Location = new Point(Convert.ToInt32(li[0]), Convert.ToInt32(li[1])); 
       pic_trans.Show(); 
      } 
    } 
相關問題