2016-02-06 21 views
0

我需要移動一個PictureBox表單內。該picturebox是Fantasma1。從圖片框的形式出去C#

這是我做的,當一個定時器(移動圖片框)蜱:

private void Move_Tick(object sender, EventArgs e) 
    { 
     Completamento.Increment(1); 

     while (Fantasma1.Location.X < MAX.X) 
       Fantasma1.Location = new System.Drawing.Point(Fantasma1.Location.X + 1, Fantasma1.Location.Y); 

     Move.Stop(); 

     MessageBox.Show("Location: " + Fantasma1.Location.X + ";" + Fantasma1.Location.Y + ", larghezza del form: " + this.Width + ", dimensione della picture: " + Fantasma1.Width); 
    } 

在窗體的構造函數中我做:

MAX.X = this.Width - Fantasma1.Size.Width; 

我認爲這個解決方案是正確的,但我的圖片框從表單中退出。 任何人都可以幫助我嗎?

+0

你能告訴你的'Form'的完整構造?我猜你在調用InitializeComponent之前設置了'MAX.X = ...'。因此'this.Width'以及'Fantasma1.Size.Width'可能還沒有被正確設置,導致錯誤的'MAX.X'。 –

+0

不,'MAX.X'被設置在'InitializeComponent'之後。 '公共Form1中() { 的InitializeComponent(); MAX.X = this.Width - Fantasma1.Size.Width; }' – Clyky

+0

您是否調試過您的代碼?使用什麼值?順便說一句:你的'while'循環沒有意義。可見的結果將是最後一個位置。你的'Form'和'PictureBox'在循環運行時不會重畫,所以你不會看到任何「移動」。 –

回答

2

首先,你fantasma的會沒有你看到它,因爲這個移動運行到結束:

while (Fantasma1.Location.X < MAX.X) 
      Fantasma1.Location = new System.Drawing.Point(Fantasma1.Location.X + 1, Fantasma1.Location.Y); 

這個循環會立即將你的鬼到底沒有任何明顯的變化,我想你希望通過Move_Tick調用來移動一個像素,並且如果達到極限,則停止計時器,並且您剛剛在第一次滴答時停住計時器,另一個錯誤。

所以,如果你想有一個幽靈在每個tick移動一個像素,不走出屏幕那麼這應該做的伎倆:

private void Move_Tick(object sender, EventArgs e) 
{ 
    int max = this.Width - Fantasma1.Width; 

    if(Fantasma.Left < max) 
     Fantasma1.Left++; 
    else 
     Move.Stop(); 
} 

在你的情況下測試的最高位置的方式是正確的,但我幾乎肯定你想在PictureBox加載圖片之前得到的大小(你設置,以便自動調整,讓PictureBox的調整它的大小,它的內容),所以爲了避免錯誤,我添加的最大計算在公式上,它是一個減法,它不消耗任何*進程。

*:幾乎所有,任何一行代碼的成本CPU,但減法可以小於一納秒,只是並不明顯。

+0

肯定的,而不是必要的,但我不得不測試,如果在PictureBox熄滅形式,如果它沒有出去,我就改變了move_tick事件,我將創建類似的動畫。 – Clyky

+0

「while」不會讓你看不到任何東西,因爲直到完成時纔會重繪表單,而不是測試動畫的好方法... – Gusman