2014-09-19 43 views
0

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

+0

的可能重复[?我如何检测鼠标移动到左侧或右侧(http://stackoverflow.com/questions/21734405/how-can -i-detect-if-the-mouse-is-being-moving-to-the-left-or-right) – Plutonix 2014-09-19 16:45:29

回答

0

你将要检查的MouseDown.X和(如果你想检查垂直方向以及或Y)比较它的MouseUp.X。请注意,(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 
} 
+0

我已经修复了错误,因此删除了以前的评论。非常感谢! – kmlle 2014-09-19 17:05:45

+0

你打赌,我第一次无法区分确切的问题,但用这段代码算出来,你可以把它弄得相当接近:) – GEEF 2014-09-19 17:14:17

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 
    // . . . 
}