Как я могу определить направление события перетаскивания?

Итак, у меня есть PictureBox, и пользователь должен перетаскивать курсор внутри него в направлении, указанном стрелкой (в PictureBox), но я не уверен, как мне установить координаты, чтобы убедиться, что пользователь перетащил правильно направление (вверх, вниз, вправо или влево).

    private void picArrow_MouseDown(object sender, MouseEventArgs e)
    {

        mPointDown = new Point(e.X, e.Y);
        //lblTest.Text = "X: " + mPointDown.X.ToString() + "   Y: " + mPointDown.Y.ToString();

    }

    private void picArrow_MouseUp(object sender, MouseEventArgs e)
    {
        lblTest.Text += "              " + " X: " + e.X.ToString() + "      Y: " + e.Y.ToString();

        //MessageBox.Show("Entered mouseup");
        //rnd_Arr refers to the number of the arrow being shown, 0 = towards the right
        if (rnd_Arr == 0 && mPointDown.X >= 0 && mPointDown.Y >= 0 && e.X >= 40 && e.Y >= 0)
        {
             //some code
        }

        else
        {
            MessageBox.Show("DONE!");

        }
    }

И я знаю, что этот код не работает, потому что даже если пользователь перетаскивает вниз (когда он должен перетаскивать вверх), он все равно принимает его и увеличивает счет.

  • Я не ставлю слишком много ограничений. Это не обязательно должна быть идеально прямая линия или начинаться и заканчиваться в точном месте. Пока пользователь перетаскивает внутри PictureBox и перетаскивает в правильном направлении или, по крайней мере, достигает минимальной длины, чтобы убедиться, что пользователь перетаскивает в правильном направлении, например:
  • Показанная стрелка указывает вправо. Пользователю не нужно перетаскивать стрелку полностью, если он перетащит по горизонтали более 40 пикселей (а вся длина стрелки составляет, скажем, 80 пикселей), то это добавит балл к его счету. Тем не менее, я обдумываю эту часть, если я просто должен быть более требовательным и требовать от пользователя перетаскивания до конца.

  • Должен ли я удалить события мыши для PictureBox и вместо этого добавить события мыши для формы? Благодарю вас!


person kmlle    schedule 19.09.2014    source источник
comment
возможный дубликат Как я могу определить, перемещается ли мышь влево или вправо?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 19.09.2014


Ответы (1)


Вы захотите проверить MouseDown.X и сравнить его с MouseUp.X (или Y, если вы хотите также проверить вертикальное направление). Важно отметить, что (0, 0) — это верхний левый угол экрана.

Начните с вычитания MouseUp.X из MouseDown.X, чтобы получить дельту X. Это ваше изменение в X пикселях по сравнению с операцией перемещения.

Если ваше сравнение X дает отрицательную дельту (MouseUp.X меньше, чем MouseDown.X), ваша мышь переместилась влево. Если ваше сравнение X дает положительную дельту (MouseUp.X больше, чем MouseDown.X), ваша мышь переместилась вправо.

Та же концепция применима к координате Y: положительное изменение означает, что вы переместили мышь вниз, а отрицательное изменение означает, что вы переместили мышь вверх. См. ниже код:

Point mouseDownPoint;
Point mouseUpPoint;
float deltaX = mouseUpPoint.X - mouseDownPoint.X;
float deltaY = mouseUpPoint.Y - mouseDownPoint.Y;
if (deltaX > 0)
{
    // Moved right
}
else if (deltaX < 0)
{
     // Moved left
}
if (deltaY > 0)
{
     // Moved down
}
else if (deltaY < 0)
{
    // Moved up
}
person GEEF    schedule 19.09.2014
comment
Я удалил свои предыдущие комментарии, так как исправил ошибку. Большое спасибо! - person kmlle; 19.09.2014
comment
Готов поспорить, сначала я не мог точно определить точную проблему, но подумал, что с помощью этого кода вы сможете решить ее довольно близко :) - person GEEF; 19.09.2014