2017-11-04 28 views
-1

C#のコードのコードには簡単な問題があります。コードは、ボタンをクリックするたびに背景色を変更することを想定しています。問題は、色を緑色に変え、即座に紫色に戻ってしまうことです。もう一度クリックすると、状況と色は変わりません。私は1つの反復の後、パラメータがデフォルトに戻るように見えるため、Application.DeEvents()に問題があると思います。これは明らかに本の瑕疵ですが、とにかくそれを機能させたかったのです。私は非常に同じコードについての質問を見つけましたが、それはforループのためであり、なぜコードが最初に機能しないのかは言えません。C#ボタンを使用してフォームの背景色を変更する

{ 
     for (int c = 0; c < 254 && Visible; c++) 
     { 
      this.BackColor = Color.FromArgb(c, 255 - c, c); 
      Application.DoEvents(); 
      System.Threading.Thread.Sleep(5); 
     } 
    } 
} 
+3

なぜループしていますか?あなたは色のアニメーションを何かしようとしていますか? – Blorgbeard

+0

私はボタンをクリックするたびにフォームの背景色を変更する必要があります。 – Mike

+0

5ミリ秒ごとにバックカラーを変更していますが、実際には色の変化に気づくことはありません –

答えて

1

254最後に254 * 5 ms = 1.27秒です。だから、クリックした直後にRGB(0、255、0)==緑が得られます。次にループは、1.27秒以内に徐々に色をRGB(253,2,253) `==紫色に変えます。あなたのコードがそれを指示するものです。

60Hz(〜16.7 ms)でのモニタのリフレッシュレートよりも5 msが短いことにも注意してください。

自動的にではなく手動で色を徐々に変更する場合は、ループを削除して、cをフィールド(メソッドの外側)に保存します。

private int c = 0; 

private void Button1_Click(object sender, EventArgs e) 
{ 
    this.BackColor = Color.FromArgb(c, 255 - c, c); 
    c = (c + 1) % 256; // 256 % 256 == 0. % = modulo operator. 
} 

ここで、クリックするたびに色が少し変わります。

+0

よろしくお願いいたします。私もループの方法を理解しました。作者はそれを例にしています。実際の例でDoEvents()を使うべきではありません。それは単なる教育的なものです。しかし、私はループのために別のものを追加しました。そこではcが下がり、ボタンをクリックすると緑色→紫色→緑色に変わり、停止します。これはおそらくその例です。助けてくれてありがとう、それを感謝します。 – Mike

+0

ええと、それは単なる教育的なものなので、学生に彼らがしてはいけないことをするように教えてくれるでしょう:-)。実世界の例では、ループの代わりにタイマーを使用する必要があります。 –

関連する問題