2012-11-22 50 views
0

我正在編寫一個愚蠢的小程序(正如我們所做的那樣),以處理一些基本的C#編碼。我相信你可以看到,點擊鼠標,圖片就會移動到鼠標點擊的地方。這一點工作正常。然後我想讓這個圖畫框隨機移動,這也是我管理的!我遇到的下一個問題是,當我單擊時,圖片框會繼續隨機移動,而不是移動到新的鼠標座標。任何幫助,將不勝感激!這是我認爲是問題的代碼。C# - 如何實時註冊onMouseClick?

非常感謝!

約翰

protected override void OnMouseClick(MouseEventArgs e) 
{ 
    base.OnMouseClick(e); 
    int destX = e.X; 
    int destY = e.Y; 

     HasArrived = false; 

    while (HasArrived == false) 
    { 
    moveImage(destX, destY, pictureBox1); 

     if (pictureBox1.Left == destX && pictureBox1.Top == destY) 
     { 
      HasArrived = true; 
      while (HasArrived == true) 
      { 
       randomMove(pictureBox1); 
       hungry1 += 1; 
      } 
     } 
    } 
} 

回答

1

你在你的內循環的stucked! 嘗試將循環放入背景工作器 中,以便您可以識別新的鼠標點擊將HasArrived設置爲true。

並且使用positive while語句中的negative while語句對我來說似乎非常糟糕, 我以前從未見過。 我不認爲這會很好..

+1

由於控件是在不同的線程中創建的,我是否必須使用Invoke(在這種情況下是BeginInvoke)才能訪問控件? –

+1

是或者你可以使用progresschanged,但我不知道它是否會凍結gui? – Vloxxity

+0

謝謝!有用! –

0

這可能是因爲HasArrived從來沒有得到任何地方設置爲false?但是這也意味着你將被困在你的Move循環中。

編輯:如果你只想在你移動到你點擊的位置後隨機移動一次,那麼在隨機位周圍移除一下,否則你需要一些其他變量來知道什麼時候打破。

0

你的內循環似乎有問題。

 HasArrived = true; 
     while (HasArrived == true) 
     { 
      randomMove(pictureBox1); 
      hungry1 += 1; 
     } 

除非randomMove()可以修改HasArrived,你的循環從未HasArrived爲false,因此while條件永遠是真實的,你永遠走不出的循環。

0

我看起來像它,因爲一旦畫面移動到目的地你的程序是停留在一個緊密的循環,同時從它從來沒有逃脫

+0

歡迎來到Stack Overflow。你能詳細解釋一下你的答案嗎? –

0

首先,你不應該用布爾表達式來測試變量的相等性。這意味着HasArrived == false不好,最好是把它寫這樣的:

while (!HasArrived) 
{ 
    // ... 
    while (HasArrived) 
    { 
    } 
} 

的問題是,你的程序不給回控制的形式,鼠標已被點擊一次後。

讓我說明,你的程序只要鼠標已被點擊的功能:

  1. 記住新的x和y COORDS
  2. 而畫面還沒有到來,移動圖像
  3. 在如果圖片已經到達它的目的地 - 隨機移動它

但它結束了移動圖片,直到你殺了程序,因爲你的窗體仍然處理「OnMous eClicked「-event。只要程序沒有從事件處理方法返回,表單就無法記錄任何其他事件(通常它應該凍結,以「應用程序沒有響應」結束)。

所以從什麼,我認爲你的代碼是應該做的,你應該編寫你的程序是這樣的: 1.創建一個並行線程隨機 2.暫停線程,只要你的鼠標點擊事件圖像周圍移動尚未處理

另外你的問題是不對的。實時表示您的程序能夠在預定義的時間限制中給出的任何結果。你的方法根本不適合這個,因爲你的方法需要執行的時間取決於你的圖像移動的速度和移動的距離。

+0

謝謝!我不確定什麼是正確的術語... –