【问题标题】:Changing Windows Form color from one to another将 Windows 窗体颜色从一种更改为另一种
【发布时间】:2013-03-10 22:28:29
【问题描述】:

我目前正在关注 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 的解决方案之后。我添加了一个断点来查看发生了什么,当我第一次单击 btnClr_Click 时,fClr 的值是 1。但是,当我再次单击它时,fClr 得到 0,但随后又立即得到 1。不确定这是否与while (Visible) 有关。 ..挠头..

【问题讨论】:

  • 我仍然不确定您要完成什么。能否请您附上一些图片?
  • link 在我的表单设计器中是这样的。当我单击btnClr_Click(表单颜色)时,它会循环通过绿色步骤,如link。我正在寻找一种解决方案,当我再次单击btnClr_Click 时,BackColor 将返回到 MediumBlue。我不确定为什么@JABFreeware 的解决方案不能解决,但它没有。

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

  • 从一个新的解决方案来看,我看到了你已经完成的工作,它可以用作逐步处理多种颜色的解决方案但它也不会停止 .我试图弄清楚如何将您的解决方案应用于我的原始项目。您的代码每次点击都会以指数方式加快步骤。您将如何使用相同的按钮停止并返回原始背景色?编辑:我看到一旦它到达某个点,它就会到达终止。该解决方案回答了这两个问题。谢谢! :)
  • 我确实有一个问题,但在这一点上肯定不是必要的;您将如何将该解决方案用于 I/O 按钮。简单地说,单击它会循环并且不会停止。您必须再次单击它才能终止。
  • private bool _started; 并在按钮中单击:_started = !_started; if (_started) { start timer } else { stop timer; reset background }。并且如果_b &gt;= 256 将其设置为0 以便循环而不是终止。
  • start timerstop timerreset background 出现错误。这些应该是方法还是内置函数?
  • 这只是伪代码(如果您愿意,可以添加注释)。我已经在上面的答案中展示了如何启动和停止计时器。
【解决方案2】:

您的一个问题是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);
            }
        }
    }

【讨论】:

  • 谢谢。我明白你在说什么。但是else 声明呢?我如何让它发挥作用?
  • 我试图提升您的评论,但我没有足够的声誉这样做。并且构建仍然只是通过绿色重新启动步骤。简而言之,它会循环并且不会停止。
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 2015-06-30
  • 2013-08-15
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多