如何检测拖动事件的方向?

时间:2014-09-19 16:40:37

标签: c# mouseevent mousedown mouseup

所以我有一个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内拖动并拖动到正确的方向,或至少达到最小长度,以确保用户拖动到正确的方向相当,例如:
  • 显示的箭头指向右侧。用户不必一直拖动箭头,如果他水平拖动超过40px(箭头的整个长度,例如,80px),那么这将为他的分数添加一个点。然而,我正在审议这一部分,如果我要求更高,并要求用户一直拖动。

  • 我应该删除PictureBox的鼠标事件并为表单添加鼠标事件吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

您将要检查MouseDown.X并将其与MouseUp.X进行比较(如果您还要检查垂直方向,则将其与Y进行比较)。重要的是要注意(0,0)是屏幕的左上角。

首先从MouseDown.X中减去MouseUp.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
}

答案 1 :(得分:0)

private void picArrow_MouseUp(object sender, MouseEventArgs e)
{
    bool movedUp, movedDown, movedLeft, movedRight;

    if (e.X == mPointDown.X) { movedRight = movedLeft = false; }
    else { movedRight = e.X < mPointDown.X; movedLeft = !movedRight; }

    if (e.Y == mPointDown.Y) { movedUp = movedDown = false; }
    else { movedUp = e.Y < mPointDown.Y; movedDown = !movedUp; }

    // Code can now use the Booleans above as needed
    // . . .
}