2014-09-19 49 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 
    // . . . 
}