将Windows窗体颜色从一个更改为另一个

时间:2013-03-10 22:28:30

标签: c# .net winforms

我目前正在关注Head First C#,但我经常独自玩游戏。我遇到了一个我无法解决的情况。我想将this.BackColor从MediumBlue更改为逐步执行绿色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);
            }
        }
    } 

我想知道的另一件事是如何让BackColor通过整个调色板。

编辑:S / n 应用JABFreeware的解决方案后。我添加了一个断点,看看发生了什么,fClr在我第一次点击btnClr_Click时得到值1 。但是,当我再次单击它时fClr得到0,然后立即再次获得1。不确定这是否与while (Visible)有关。 ..Head Scratcher ..

2 个答案:

答案 0 :(得分:0)

您的一个问题是int fClr = 0;位于按钮单击事件处理程序内部,因此每次单击按钮时,它都会重置为0.将变量移动到click事件之外。

像这样:

        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);
            }
        }
    }

答案 1 :(得分:0)

使用计时器更容易。这样,您的用户界面将保持响应状态,而无需使用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),我会重置红色并增加绿色。如果超出绿色范围,我会重置绿色并增加蓝色。最后,如果超出蓝色范围,我将终止该过程。

相关问题