0

私は現在 Head First C# に従っていますが、ときどき自分で遊んでいます。解決できない状況に陥りました。this.BackColorMediumBlue から Green 0 - 255 までステップスルーし、ボタン I/O でコンソールに戻るように変更したいと考えています。問題は、ステップを停止して MediumBlue に戻る色を取得できないことです。

private void btnClr_Click(object sender, EventArgs e)
    {
        int fClr = 0;
        while (Visible)
        {
            if (fClr == 0)
            {
                fClr++;
                for (int nBackClr = 0; nBackClr < 255 && Visible; nBackClr++)
                {
                    this.BackColor = Color.FromArgb(nBackClr, 255 - nBackClr, nBackClr);
                    Application.DoEvents();
                    Thread.Sleep(2);
                }
                for (int z = 255; z >= 0 && Visible; z--)
                {
                    this.BackColor = Color.FromArgb(z, 255 - z, z);
                    Application.DoEvents();
                    Thread.Sleep(2);
                }
            }
            else
            {
                fClr--;
                this.BackColor = Color.MediumBlue;
                Application.DoEvents();
                Thread.Sleep(1);
            }
        }
    } 

私が知りたいもう 1 つのことはBackColor、全体のカラー パレットを通過させる方法です。

編集: S/n JABFreeware のソリューションを適用した後。何が起こっているかを確認するためにブレークポイントを追加し、fClr最初に をクリックしたときに 1 の値を取得しますbtnClr_Click。ただし、もう一度クリックするfClrと0になりますが、すぐに再び1になります。これが と関係があるかどうかはわかりませんwhile (Visible)。..ヘッドスクラッチャー..

4

2 に答える 2

0

タイマーを使用する方が簡単です。そうすれば、UI は を使用せずにレスポンシブのままになりますDoEvents

const int ColorStep = 16;

private Timer _timer;
private int _r, _g, _b;

public frmRotateColors()
{
    InitializeComponent();
}

private void btnStart_Click(object sender, EventArgs e)
{
    _r = 0;
    _g = 0;
    _b = 0;

    // Start the timer
    _timer = new Timer { Interval = 10 };
    _timer.Tick += Timer_Tick;
    _timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    if (_b >= 256) { 
        _timer.Dispose(); // Stop the timer.
        this.BackColor = SystemColors.Control; // Reset the background color.
    } else {
        this.BackColor = Color.FromArgb(_r, _g, _b);

        // Get next color
        _r += ColorStep;
        if (_r >= 256) {
            _r = 0;
            _g += ColorStep;
            if (_g >= 256) {
                _g = 0;
                _b += ColorStep;
            }
        }
    }
}

ここでは、赤色を増やしてすべての色を回転させます。赤色の範囲 (0 ~ 255) から外れている場合は、赤色をリセットして緑色を増やします。緑色の範囲を超えた場合は、緑色をリセットして青色を増やします。最後に、青色の範囲を超えた場合はプロセスを終了します。

于 2013-03-10T23:38:59.293 に答える
0

問題の 1 つはint fClr = 0;、ボタン クリック イベント ハンドラー内にあるため、ボタンをクリックするたびに 0 にリセットされることです。変数をクリック イベントの外に移動します。

このような:

        int fClr = 0;
private void btnClr_Click(object sender, EventArgs e)
    {
        while (Visible)
        {
            if (fClr == 0)
            {
                fClr++;
                for (int nBackClr = 0; nBackClr < 255 && Visible; nBackClr++)
                {
                    this.BackColor = Color.FromArgb(nBackClr, 255 - nBackClr, nBackClr);
                    Application.DoEvents();
                    Thread.Sleep(2);
                }
                for (int z = 255; z >= 0 && Visible; z--)
                {
                    this.BackColor = Color.FromArgb(z, 255 - z, z);
                    Application.DoEvents();
                    Thread.Sleep(2);
                }
            }
            else
            {
                fClr--;
                this.BackColor = Color.MediumBlue;
                Application.DoEvents();
                Thread.Sleep(1);
            }
        }
    }
于 2013-03-10T22:42:30.660 に答える