【问题标题】:How can I detect the direction of a dragging event?如何检测拖动事件的方向?
【发布时间】:2014-09-20 01:02:23
【问题描述】:

所以我有一个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 的鼠标事件并改为为表单添加鼠标事件吗? 谢谢!

【问题讨论】:

标签: c# mouseevent mousedown mouseup


【解决方案1】:

您将要检查 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
}

【讨论】:

  • 我已经删除了我以前的 cmets,因为我已经修复了错误。非常感谢!
  • 你打赌,我一开始并不能完全区分确切的问题,但想用这段代码你可以得到它相当接近:)
【解决方案2】:
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
    // . . .
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2012-05-02
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多