Переместите прямоугольник с помощью мыши - PullRequest
5 голосов
/ 26 декабря 2011

Я написал этот код:

private struct MovePoint
    {
        public int X;
        public int Y;
    }
private void Image_MouseDown(object sender, MouseEventArgs e)
    {
        FirstPoint = new MovePoint();
        FirstPoint.X = e.X;
        FirstPoint.Y = e.Y;
    }

    private void Image_MouseMove(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left)
        {
            if(FirstPoint.X > e.X)
            {
                Rectangle.X = FirstPoint.X - e.X;
                //Rectangle.Width -= FirstPoint.X - e.X;
            } else
            {
                Rectangle.X = FirstPoint.X + e.X;
                //Rectangle.Width += FirstPoint.X + e.X;
            }

            if(FirstPoint.Y > e.Y)
            {
                Rectangle.Y = FirstPoint.Y - e.Y;
                //Rectangle.Height -= FirstPoint.Y - e.Y;
            } else
            {
                Rectangle.Y = FirstPoint.Y + e.Y;
                //Rectangle.Height += FirstPoint.Y + e.Y;
            }

            Image.Invalidate();
        }
    }
private void Image_Paint(object sender, PaintEventArgs e)
    {
        if(Pen != null) e.Graphics.DrawRectangle(Pen, Rectangle);
    }

Прямоугольник движется, но с инверсией (не должно быть). Вы можете помочь?

1 Ответ

5 голосов
/ 26 декабря 2011

Математика в вашем обработчике перемещения мыши для перемещения прямоугольника, основанного на движениях мыши, кажется довольно неправильной; Я думаю, что вы хотите что-то вроде этого:

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. Кроме того, в общем, старайтесь не создавать изменяемые структуры.

...