2016-03-12 32 views
0

我有一點麻煩形成阻力,並在面板拖放按鈕和麪板來識別它,並用按鈕顯示消息名稱拖動和刪除按鈕(按鈕將不會跟隨)

到目前爲止,我管理拖放和識別的部分,但是我錯過了拖動的視覺風格,當我用鼠標按下時,它只會坐在同一個地方,它不會跟隨光標。我如何使它跟隨鼠標?

public Form1() 
    { 
     InitializeComponent(); 

     panel1.AllowDrop = true; 
     panel1.DragEnter += panel_DragEnter; 
     panel1.DragDrop += panel_DragDrop; 
     button1.MouseDown += button1_MouseDown; 
    } 

    private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     button1.DoDragDrop(button1.Text, DragDropEffects.Copy | DragDropEffects.Move); 
     button1.Location= new Point(e.X, e.Y); 
    } 

    private void panel_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Move; 
     if (e.Data.GetDataPresent(DataFormats.Text)) 
      e.Effect = DragDropEffects.Copy; 
     else 
      e.Effect = DragDropEffects.None; 
    } 

    private void panel_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) 
    { 
     MessageBox.Show(e.Data.GetData(DataFormats.Text).ToString()); 

    } 
+0

有按鈕的位置跟隨鼠標移動 – Plutonix

+0

@Plutonix你能寫一個代碼示例,我知道我必須做的那個工作,但仍然沒有運氣,使其發生 – maran

回答

0

你必須記住的是,DoDragDrop方法不返回你扔下對象的位置。 DragDrop事件處理。

要在拖動時移動控件,請使用面板的DragOver事件。在實現中,需要補償EventArgs中的X和Y座標是基於屏幕的事實,而您需要基於Client的座標來正確定位控件。該PointToClient是在器樂:

private void panel_DragOver(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(typeof(Button).FullName)) 
    { 
     var draggedButton = (Button)e.Data.GetData(typeof(Button).FullName); 

     var screenpos = new Point(e.X, e.Y); 
     var clientPos = panel1.PointToClient(screenpos); 
     // calc offset 
     draggedButton.Location = new Point(
      clientPos.X + panel1.Left, 
      clientPos.Y + panel1.Top); 
    } 
} 

注意您的數據現在包含的,而不是隻有文字的實際按鈕。這使得您可以拖動多個按鈕,而不僅僅是button1。

DragDrop事件現在應該是這樣的:

private void panel_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(typeof(Button).FullName)) 
    { 
     var draggedButton = (Button)e.Data.GetData(typeof(Button).FullName); 
     MessageBox.Show(draggedButton.Text); 

     var screenpos = new Point(e.X, e.Y); 
     var clientPos = panel1.PointToClient(screenpos); 
     draggedButton.Location = new Point(
      clientPos.X + panel1.Left, 
      clientPos.Y + panel1.Top); 
    } 
} 

而且DragEnter只稍微改變,從而能夠處理Button控件而不是文本:

private void panel_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Move; 

    if (e.Data.GetDataPresent(typeof(Button).FullName)) // button 
     e.Effect = DragDropEffects.Copy; 
    else 
     e.Effect = DragDropEffects.None; 
} 

終於搞定了這一切啓動並連接構造函數代碼和MouseDown按鈕的實現:

public Form1() 
{ 
    InitializeComponent(); 
    panel1.AllowDrop = true; 
    panel1.DragEnter += panel_DragEnter; 
    panel1.DragDrop += panel_DragDrop; 
    panel1.DragOver += panel_DragOver; 
    button1.MouseDown += button1_MouseDown; 

} 

private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    button1.DoDragDrop(button1, DragDropEffects.Copy | DragDropEffects.Move); 
} 
+0

非常感謝你,我會嘗試一下儘快 :) – maran