Re: [問題] 拖曳picturebox

看板C_Sharp (C#)作者 (躂躂..)時間18年前 (2007/04/24 06:51), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/4 (看更多)
※ 引述《kenny0622 ()》之銘言: : 還是有drag之類的事件可以直接控制(有這個事件嗎?) 是有個drag, 不過那個drag不是用來移動控制項的~ 所以主要還是用 MouseDown/MouseMove來動動, 有幾點要注意 1. Mouse Events的 X,Y都是控制項內的相對座標, 所以要動動時, 要把該座標轉成 form 的相對座標 或整個screen的絕對座標, 才能正確的移動控制項. 前者可以直接用 e.X/Y 加上 sender的LocationX.Y 後者則是利用 Control的PointToClient()和PointToScreen() 選一個方式做就行了~ 2. 點擊點和移動中, mouse和控制項應該要維持相同的相對座標, 對使用者操作上較合理, 所以mouse down時要記錄這個相對座標, 3. 移動中的物件應該在最上方(不被其他覆蓋) 這可以用 Control.BrinToFront() 達成 4. 檢查mouse是否移動到某物上, 可以利用 Rectangle的Contrains 這樣就可以知道某座標是某在某區塊(ex:垃圾桶)中 (因為拖曳時下層會被上層蓋過, 所以MouseHover 無法使用) 你可以在 form 上放多個picturebox.. 將他們的 MouseMove與MouseDown都分別設成以下兩個method, 就可以看出效果了~ private Point initPoint = new Point(); private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if ( (e.Button & MouseButtons.Left) > 0) { /* 將控制項移到mouse所在的位置 */ Point p = new Point(); p.X = ((Control)sender).Location.X + e.X - initPoint.X; p.Y = ((Control)sender).Location.Y + e.Y - initPoint.Y; ((Control)sender).Location = p; p.X += initPoint.X; p.Y += initPoint.Y; /* 檢查mouse在拖曳到哪個控制項的上面 */ bool found = false; foreach( Control ctrl in this.Controls) { if (ctrl.GetType() == typeof(PictureBox) ) { Rectangle r = new Rectangle(ctrl.Location, ctrl.Size); if (ctrl != sender && r.Contains(p.X, p.Y) && !found) { ((Control)ctrl).BackColor = Color.Red; found = true; } else ((Control)ctrl).BackColor = SystemColors.Control; } } } } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { initPoint.X = e.X; initPoint.Y = e.Y; ((Control)sender).BringToFront(); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.134.11

04/24 08:47, , 1F
寫的好詳細
04/24 08:47, 1F

04/24 14:09, , 2F
謝謝你!!!! 我來研究研究!!!
04/24 14:09, 2F

08/13 12:23, , 3F
太好了 找到我要的答案了^^
08/13 12:23, 3F
文章代碼(AID): #16BJYAzL (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #16BJYAzL (C_Sharp)