2009-02-20 14 views
2

Я разрабатываю приложение для Windows Mobile (Compact Framework 2.0). Он имеет wimforms с pictureBox.Перемещение PictureBox с помощью мыши

Я хочу переместить изображение pictureBox, но я не знаю, как это сделать, поэтому я решил переместить отверстие pictureBox. Для этого я использую это событие:

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

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

Что я делаю неправильно?

Спасибо!

ответ

6

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

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

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

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

Вы можете использовать imagenMapa.PointToScreen, чтобы получить координаты мыши в координатах экрана (или Cursor.Position, чтобы получить позицию напрямую) и yourForm.PointToClient, чтобы вернуть их в виде координат.

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

+0

Даниель это хорошая теория, но вы можете положить его в код, пожалуйста? У меня такой же точный вопрос, но на VB.net. пожалуйста помоги! –

1

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

1

Также не забудьте установить форму двойной буферизации, которые могли бы помочь с мерцанием, но и для фактического расположения этого, мне нравится Daniel L'сек предложение

+0

Я использую Compact Framework, а Forms не имеет двойного буфера. Как я могу это сделать? – VansFannel

+0

В этой ссылке описывается создание окна с двойным буфером. Простите, я думаю, я не платил. когда вы сказали, что CF 2.0 http://stackoverflow.com/questions/574958/c-cf-winforms-and-double-buffer – Fry

1

Объятия математику!

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

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

5

Фактический код (требуется .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; 
}; 
+0

Это работает безупречно! Спасибо, что нашли время, чтобы поделиться кодом :) – saurabhj

+0

Добро пожаловать. – theJerm

0

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

например:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    imagenMapa.Left = e.X; 
    imagenMapa.Top = e.Y; 
} 
Смежные вопросы