2016-10-03 84 views
0

我的Windows窗體應用程序中有兩個pictureboxes。這些照片箱中的每一個都有一個圖像。 pictureBox1很小,只有122 x 52,而pictureBox2更大(459 x 566)。我想要做的就是將picturebox1的圖像拖放到picturebox2上,並創建並保存一個新圖像。無論哪個x & y座標我放置pictureBox1的圖像,它會將它「標記」在pictureBox2中的該位置。然後pictureBox2的圖像將被修改並保存。所以只需簡單地拖放,用戶應該能夠輕鬆地將圖像「印記」到pictureBox2上。這可能嗎?如何在C#中的另一個圖片框中的另一個圖片框中的另一圖片框中拖放一個圖像?

+0

Pictureboxes是對照。他們包含的圖像是別的東西。你將不得不將第二個圖像繪製到第一個圖像上。 – Plutonix

+0

這很好,但是有沒有辦法獲得放置圖像的位置的座標?我假設我在DragDrop或DragEnter事件中的代碼隱藏中創建新圖像? – MrSnrub

回答

0

Snrub先生,

如果使用拖放,你是在你想要做的事情的控制。通常,在控件的MouseDown事件中,您可以確定dragevent是否正在啓動。我保留一個表單屬性。

private Point _mouseDownPoint; 

我設置在從控制的MouseDown

protected override void OnMouseDown(MouseEventArgs e) 
    { 
     _mouseDownPoint = e.Location; 
    } 

期間的阻力。在該相同控制的OnMouseMove事件。此代碼可確保用戶最有可能嘗試拖動並開始拖動。這段代碼來自usercontrol,所以DoDragDrop中的這個代碼可能不得不在你的情況下改變。

protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 
     if (e.Button != MouseButtons.Left) return; 
     var dx = e.X - _mouseDownPoint.X; 
     var dy = e.Y - _mouseDownPoint.Y; 
     if (Math.Abs(dx) > SystemInformation.DoubleClickSize.Width || Math.Abs(dy) > SystemInformation.DoubleClickSize.Height) 
     { 
      DoDragDrop(this, DragDropEffects.Move); 
     } 
    } 

可能收到放置的您的控件應該對其DragEnter事件進行編碼。這裏我們有一個DragEnter事件,它區分了ToolStripButton和自定義的UserControl DSDPicBox。沒有編碼DragEnter事件的控件將在拖動時顯示noDrop圖標。

private void Control_DragEnter(object sender, DragEventArgs e) 
    { 
     var button = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton; 
     if (button != null) 
     { 
      e.Effect = DragDropEffects.Copy; 
      return; 
     } 
     var element = e.Data.GetData(typeof(DSDPicBox)) as DSDPicBox; 
     if (element == null) return; 
     e.Effect = DragDropEffects.Move; 
    } 

最後,你必須處理下降。 panelDropPoint是物品放置位置的座標。你可以用它來將你的新圖像放在舊圖像中。如果您要更改尺寸,則必須以新分辨率渲染圖片。

private void panel_DragDrop(object sender, DragEventArgs e) 
    { 
     // Test to see where we are dropping. Sender will be control on which you dropped 
     var panelDropPoint = sender.PointToClient(new Point(e.X, e.Y)); 
     var panelItem = sender.GetChildAtPoint(panelDropPoint); 
     _insertionPoint = panelItem == null ? destination.Controls.Count : destination.Controls.GetChildIndex(panelItem, false); 

     var whodat = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton; 

     if (whodat != null) 
     { 
      //Dropping from a primitive button 
      _dropped = true; 
      whodat.PerformClick(); 
      return; 
     } 

     } 

我已經從代碼中刪除了一些項目,這些代碼只是渾濁了水域。此代碼可能無法正常工作,但應該讓您靠近。

問候, 馬克

相關問題