防止控件移出容器

时间:2012-08-17 07:43:41

标签: c# winforms controls mouseevent mousemove

这个问题与我的另一个问题有关,可以在can be found here找到。我想在其父容器中移动一个PictureBox TabPage(如果确实有任何区别!)使用下面的代码可以完成移动:

private Point start = Point.Empty; 
private bool _mapPackageIsMoving;    

void pictureBoxPackageView_MouseUp(object sender, MouseEventArgs e) { 
  _mapPackageIsMoving = false; 
} 

void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) { 
  if (_mapPackageIsMoving) { 
    pictureBoxPackageView.Location = new Point( 
                             pictureBoxPackageView.Left + (e.X - start.X),  
                             pictureBoxPackageView.Top + (e.Y - start.Y)); 
  } 
} 

void pictureBoxPackageView_MouseDown(object sender, MouseEventArgs e) { 
  start = e.Location; 
  _mapPackageIsMoving = true; 
} 

现在我的问题是,这种控制的移动没有​​限制。用户可以将控件拖动距离我的图片框所在的TabPage的可见区域。我尝试通过更改此类MouseMove事件来添加一些移动限制,以防止它离开标签页的LeftRight可见区域:

void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) { 
  if (_mapPackageIsMoving) { 
   //Added condition
  if (pictureBoxPackageView.Left >= 0 && pictureBoxPackageView.Right >= 0)
    pictureBoxPackageView.Location = new Point( 
                             pictureBoxPackageView.Left + (e.X - start.X),  
                             pictureBoxPackageView.Top + (e.Y - start.Y)); 
  } 
} 

但上面代码的问题是当图片框点击容器的右侧或左侧并且LeftRight等于0时,我无法移动控件。< / p>

任何帮助/提示,​​以限制图片框Left, Right, Top and Bottom的容器内的这种移动将受到关注!

2 个答案:

答案 0 :(得分:3)

你可以无条件地移动盒子(不测试当前位置)并对你的新位置有限制:

int nx = Math.Min(Math.Max(pictureBoxPackageView.Left + (e.X -start.X),0),pictureBoxPackageView.Parent.Width-pictureBoxPackageView.Width);
int ny = Math.Min(Math.Max(pictureBoxPackageView.Top + (e.Y -start.Y),0),pictureBoxPackageView.Parent.Height-pictureBoxPackageView.Height);

pictureBoxPackageView.Location = new Point(nx,ny);

答案 1 :(得分:-1)

我认为如果您添加以下代码,它会将项目移动到顶部作为选项。

//- MouseDownLocation.X
 //- MouseDownLocation.Y 

       int nx = Math.Min(Math.Max(label1.Left - MouseDownLocation.X + (e.X - start.X), 0), label1.Parent.Width - label1.Width);
       int ny = Math.Min(Math.Max(label1.Top - MouseDownLocation.Y + (e.Y - start.Y), 0), label1.Parent.Height - label1.Height);