Вопрос по controls, winforms, mousemove, c#, mouseevent – Предотвращение перемещения элемента управления из его контейнера

1

Этот вопрос связан с другим моим вопросом, который можно найти здесьможно найти здесь, Я хотел переместить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 который мой Picturebox находится внутри него. Я попытался добавить некоторые ограничения для движения, изменивMouseMove событие, как это, по крайней мере, предотвратить его выход изLeft а такжеRight видимая область вкладки:

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)); 
  } 
} 

Но проблема с приведенным выше кодом заключается в том, что каждый раз, когда picturebox попадает в правую или левую часть контейнера иLeft или жеRight получить равным 0, я не могу больше перемещать элемент управления.

Любые подсказки / советы по достижению ограничения этого движения внутри контейнера дляLeft, Right, Top and Bottom из коробки изображения будут оценены!

Ваш Ответ

2   ответа
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);
здесь есть опечатка ..pictureBoxPackageView.parent должно бытьpictureBoxPackageView.Parent
Неважно, нашел это какvar y = Math.Min(Math.Max(finalLocation.Y, 0), pictureBoxPackageView.Bottom); Saeid Yazdani
@aswzen ... исправлено
Спасибо! Это работает как шарм. Не могли бы вы рассказать мне еще одну вещь? Как я могу позволить контролю двигаться черезBottom контейнера? Я имею в виду, что ограничение не должно применяться для нижнего, но все равно применяется для левого, правого и верхнего. Saeid Yazdani
-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);
Почему вы повторяете ответ на очень старую тему? Здесь для некоторых быстрых моментов ?! Saeid Yazdani
Я думаю, что мы немного слишком чувствительны. Я ничего не знаю о баллах и не знал, что быть полезным было игрой. Это какая-то игра, о которой я не знаю? Я просто пытался быть полезным. Но это может объяснить, почему все так хотят помочь. Lol Я бы задавал вопрос и получал отрицательные баллы. Это игровой сайт ??

Похожие вопросы