Математика в вашем обработчике перемещения мыши для перемещения прямоугольника, основанного на движениях мыши, кажется довольно неправильной; Я думаю, что вы хотите что-то вроде этого:
private void Image_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
int initialX = 0, initialY = 0; // for example.
Rectangle.X = (e.X - FirstPoint.X) + initialX;
Rectangle.Y = (e.Y - FirstPoint.Y) + initialY;
Image.Invalidate();
}
}
Таким образом, левый верхний угол прямоугольника будет следовать за мышью, отслеживая дельту между начальным положением мыши и текущим указателем мыши. Однако обратите внимание, что каждый раз, когда вы снова щелкаете и перетаскиваете, прямоугольник возвращается к своему оригинальному местоположению.
Если вместо этого вы хотите, чтобы Rectangle «запоминал» свою позицию в течение нескольких операций щелчка и перетаскивания (т. Е. Чтобы не инициализировать его в исходное положение при нажатии мыши), вы можете сделать:
private void Image_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// Increment rectangle-location by mouse-location delta.
Rectangle.X += e.X - FirstPoint.X;
Rectangle.Y += e.Y - FirstPoint.Y;
// Re-calibrate on each move operation.
FirstPoint = new MovePoint { X = e.X, Y = e.Y };
Image.Invalidate();
}
}
Еще одно предложение: нет необходимости создавать свой собственный тип MovePoint
, когда уже есть тип System.Drawing.Point
. Кроме того, в общем, старайтесь не создавать изменяемые структуры.