Перемещение PictureBox с помощью мыши

Я разрабатываю приложение для Windows Mobile (Compact Framework 2.0). У него есть WinForms с PictureBox.

Я хочу переместить изображение PictureBox, но не знаю, как это сделать, поэтому решил переместить отверстие PictureBox.

Для этого я использую это событие:

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

Но когда я перемещаю PictureBox, он мигает и перемещается повсюду.

Что я делаю не так?


person VansFannel    schedule 20.02.2009    source источник


Ответы (6)


e.X и e.Y относятся к графическому блоку (например, если мышь находится в верхнем левом углу графического блока, это 0,0).

Значения для imagenMapa.Left и imagenMapa.Top относятся к форме (или любому другому элементу управления, содержащему imagenMapa).

Если вы попытаетесь смешать значения из этих двух систем без преобразования, вы получите скачки (как вы видите).

Вероятно, вам лучше преобразовать положение мыши в ту же систему координат, что и предмет, содержащий графическое поле.

Для получения координаты мыши в координатах экрана (или Cursor.Position < / a>, чтобы получить позицию напрямую) и yourForm.PointToClient, чтобы вернуть их в координаты формы.

Обратите внимание, что в зависимости от ваших потребностей вы можете выполнить «перемещение изображения в элементе управления», переопределив / обработав _ 9_ событие элемента управления и рисование изображения самостоятельно. Если бы вы сделали это, вы могли бы сохранить все в координатах графического окна, поскольку это, вероятно, то, что вы использовали бы при вызове _ 10_.

person Daniel LeCheminant    schedule 20.02.2009
comment
Дэниел, это хорошая теория, но не могли бы вы поместить ее в код, пожалуйста? У меня такой же вопрос, но в VB.net. пожалуйста помоги! - person Alex Gordon; 29.06.2009

Фактический код (требуется .NET Framework 3.5 и выше, не уверен, доступен ли он в Compact Framework) ...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};
person theJerm    schedule 01.02.2013
comment
Работает безупречно! Спасибо, что нашли время поделиться кодом :) - person saurabhj; 06.12.2013

e.X и e.Y находятся в координатном пространстве pictureBox, imagenMapa.Left и imagenMapa.Top находятся в координатном пространстве формы. :-)

person Dan Byström    schedule 20.02.2009

Также не забудьте установить для вашей формы двойную буферизацию, что может помочь с мерцанием, но для его фактического позиционирования мне нравится предложение Дэниела Л.

person Fry    schedule 20.02.2009
comment
Я использую Compact Framework, а в Forms нет двойного буфера. Как я могу это сделать? - person VansFannel; 22.02.2009
comment
Эта ссылка описывает, как создать блок изображения с двойной буферизацией. Извините, я полагаю, что не заплатил attn. когда вы сказали CF 2.0 stackoverflow.com/questions / 574958 / - person Fry; 23.02.2009

Примите математику!

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

Краткое объяснение: вы получаете разницу в положениях мыши и применяете ее к объекту, который хотите переместить.

Пример: если у старой мыши позиция X составляет 382, ​​а у новой - 385, то разница составляет -3. Если текущее положение X элемента управления равно 10, то 10 - (-3) = 13

Почему: это работает для чего угодно и намного дешевле, чем постоянное преобразование координат туда и обратно.

person insaina    schedule 19.05.2012

На самом деле то, что вы сделали, правильно. Но вы передали свойство MouseMove полю изображения. Вы должны передать это свойство Форме (фону).

ex:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
person cdc    schedule 08.02.2017