作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] 拖曳picturebox
时间Tue Apr 24 06:51:53 2007
※ 引述《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
1F:推 SmartGoose:写的好详细 04/24 08:47
2F:推 kenny0622:谢谢你!!!! 我来研究研究!!! 04/24 14:09
3F:推 wnlq6k528:太好了 找到我要的答案了^^ 08/13 12:23