2017-06-20 6 views
0

この無限の虹背景ループが機能しないのはなぜですか?私はこのコードをC#フォームで実行していますが、button1をクリックした後に背景色が変わることが考えられます。私は、無限ループメーカーのような違いを試しました:for(;;)。しかし、ここでのコードは次のとおりです。 C#Infinite Rainbow Background Loop

private void button1_Click(object sender, EventArgs e) 
 
     { 
 
    while (true) 
 
    { 
 
     this.BackColor = System.Drawing.Color.Red; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.DarkRed; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.Orange; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.Yellow; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.Green; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.DarkGreen; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.Blue; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.DarkBlue; 
 
     System.Threading.Thread.Sleep(250); 
 
     this.BackColor = System.Drawing.Color.Violet; 
 
    }

はあなたに感謝します。

+0

このコードを実行するアプリケーションの種類は何ですか? – ali

+3

この「機能しない」とはどのようにして現れますか? –

+0

このコードはどこで実行されていますか? OnPaintで? –

答えて

3

私はそれはあなたが必要なもの睡眠のフォームは、これ以外の意志から

public List<Color> colors = new List<Color> { 
    Color.Red, 
    Color.DarkRed, 
    Color.Orange 
}; 

private int current; 
private Timer t = new Timer(); 
public Form1() { 
    InitializeComponent(); 
    t.Interval = 250; 
    t.Tick += T_Tick; 

} 

private void T_Tick(object sender, System.EventArgs e) { 
    this.BackColor = colors[current++]; //change to rainbows other colors 
    current %= colors.Count; // rainbow does not have infinite color, we should start again somewhere 
} 

*your_click_method* { 
    t.Start(); 
} 
+0

ありがとうございますが、button1をクリックした後にレインボーを起動する必要があります:private void button1_Click(オブジェクト送信者、EventArgs e) {//ここにコード} –

+0

答えを編集しました – tetralobita

0

あなたの問題を解決するために迅速かつ汚い方法Timerあるので、あなたがThread.Sleep(n)を行うことができない、それはWindowsフォームだと思います恐ろしく見えますが、 あなたの無限ループがGUIスレッドをブロックするので、GUIは更新されません。 これは、あなたのプログラマーが変更された背景色を適用する時間がないことを意味します。

Windowsフォームを使用していると仮定すると、250msの間隔でタイマーをフォームにドロップする必要があります。 はその後...それそのフォームのメンバーにするものは何でも、配列、リストに

private List<Color> rainbowColors = new List<Color>() 
     { 
      Color.Red, 
      Color.DarkRed, 
      .... 
     }; 

をあなたの色を保存するまた、あなたは、現在表示されている色を知るために、インデックスが必要になります。あなたのタイマーイベントで

private int rainbowIndex; 

はこのような何かを:

private void timer_Elapsed(object sender, EventArgs e) 
{ 
    this.BackColor = this.rainbowColors[this.rainbowIndex++]; 
    this.rainbowIndex = this.rainbowIndex % this.rainbowColors.Count; 

    this.Invalidate(); //Really change the formcolor 
} 

したがって、各タイマ間隔のあなたは、1つの色を移動して、最後の色が表示されている場合は、それをリセットします。

+1

あなたのインデックスを増やすのを忘れたと思います。 –

+0

Thats absolutly right;) – feal

+1

を簡単に変更しました。 'BackColor = rainbowColors [(rainbowIndex ++)%rainbowColors.Count]' – Rotem