Re: [問題] 拖曳picturebox
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章