2014-01-18 26 views
0

我有以下代碼,它在按鍵上開始將兩個標籤從表單頂部移到底部,並在到達表單底部後停止。我用定時器完成了它。這裏是在動畫過程中的代碼如何在計時器中使用按鍵事件?

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    label1.Text = "Key Pressed: " + e.KeyChar; 
    //animate(sender, e); 
    timer1.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Random random = new Random(); 
    int X = random.Next(0, 1230); 
    int y = X; 
    label2.Location = new Point(X, 5); 
    label3.Location = new Point(X + 20, 5 + 20); 
    for (int i = 5; i <= 470; i++) 
    { 
     label2.Location = new Point(y, i); 
     label3.Location = new Point(y + 20, i + 20); 
     Thread.Sleep(1); 
    } 
    timer1.Stop(); 
} 

現在(從形式向底部的頂部),當我按下鍵,也就是說,它完成了蜱事件,然後,只有到達底部之後動畫重新啓動然後重新開始或停止。

現在我想的是,每當,標籤的滴答期間這一運動從頂部向底部即期間,如果我按任意鍵(或任何特定的鍵),定時器應停止。

總之,Timer1_Tick方法時,我希望它立即停止對按鍵。

我試過,但不能讓它開始工作。我希望你們這裏的人會幫我把這個問題排除出去,希望你們儘早回覆。感謝您的時間!

回答

0

嘗試它是如此簡單

所有我建議你使用的keyDown和KeyUp事件,而不是按鍵的
Public Boolean tick = false; 
private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
tick = !tick; 
    label1.Text = "Key Pressed: " + e.KeyChar; 
    //animate(sender, e); 
if(tick) 
    timer1.Start(); 
else 
    timer1.Stop(); 
} 
+0

@ user3206911您是否檢查了此 –

0

第一。要解決你的問題:簡單地設置一個bool = true在keyDown上,而bool = false在keyUp上。現在你可以檢查你內部的布爾方法,如果你檢測到鍵被按下,你可以做任何你想做的事情。

+0

我按照您的建議做了它,它看起來像Up和Down事件應該做的工作。現在我已經刪除了Thread.Sleep(1);聲明並將其替換爲bool值檢查並且它可以工作。但問題是現在標籤的速度非常快,幾乎不可能看到它們代表的文字。我爲每次迭代使用Thread.Sleep(1)來控制睡眠。有什麼其他方式可以減慢速度嗎? – user3206911

+0

@ user3206911在其他答案中正確使用計時器。定時器用於每x毫秒的常規操作。在你的情況下,每個勾號 - 如果(布爾)通過dX(或dY)翻譯 - 否則 - 不做任何事情。並設置您的定時器的打勾頻率,以便您希望移動的速度(或dX/dY)。 (如果我理解正確) – wondra

2

這裏的問題是,你是不是真的使用Timer,它的預期使用方式。理想情況下,每當Ticket事件觸發Timer時,您都會有一個事件發生變化。

在這裏,你聽的事件,做了幾輪處理,而不從此時您停止計時器處理程序永遠歸還。這意味着代碼將只處理一次tick事件而不是N次。

要解決這個問題試圖打破了處理程序,每個時鐘週期執行增量工作一次,一旦圖紙完成後才能停止。這也將允許您處理tick事件之間的關鍵事件並停止計時器。打破工作的最佳地點是撥打Thread.Sleep(本身不應出現在處理程序中)

+0

謝謝JaredPar。問題是現在標籤的速度非常快,幾乎不可能看到它們代表的文字。我爲每次迭代使用Thread.Sleep(1)來控制睡眠。有什麼其他方式可以減慢速度嗎? – user3206911

+0

@ user3206911嘗試增加'Timer'的持續時間。讓滴答聲之間的時間至少等一秒鐘。如果您只移動票上的標籤,那麼兩次移動之間的時間間隔也將至少爲一秒 – JaredPar

相關問題