不断改变形状颜色

本文关键字:颜色 变形 改变 | 更新日期: 2023-09-27 17:50:41

我希望我的程序不断改变字体背景颜色,但我希望它顺利进行,所以我试图修改一个颜色变量Color custom;,并使用它来为背景颜色的形式this.BackColor = custom;,但它不工作,我不知道如何使它工作,这里是完整的代码:

private void Principal_Load(object sender, EventArgs e)
{
    Color custom;
    int contr = 0, contg = 0, contb = 0;
    do
    {
            while (contr < 255 && contg == 0)
            {
                if (contb != 0)
                {
                    contb--;
                }
                contr++;
                while (contg < 255 && contb == 0)
                {
                    if (contr != 0)
                    {
                        contr--;
                    }
                    contg++;
                    while (contb < 255 && contr == 0)
                    {
                        if (contg != 0)
                        {
                            contg--;
                        }
                        contb++;
                    }
                }
            }
            custom = Color.FromArgb(contr, contg, contb);
            this.BackColor = custom;
    } while (true);
}

不断改变形状颜色

很简单你没有延迟。添加

Thread.Sleep(1000);

所有这些都必须在一个单独的线程上发生!否则你的UI会卡住

检查这个

首先,您当前的代码不能工作,但不是因为任何线程问题(尽管这确实需要解决)。

问题是这些行永远不会被击中:

custom = Color.FromArgb(contr, contg, contb);
this.BackColor = custom;

你的while循环中的逻辑不工作。

生成的值是以下集合:

(0, 0, 1), (0, 0, 2) ... (0, 0, 255), (0, 254, 1), (0, 253, 2) ... (0, 1, 254)

然后它只是重复尝试产生这些值,但永远不能跳出while (contr < 255 && contg == 0)循环。

现在,假设这就是你想要的,那么我建议最好的方法是使用微软的响应式框架。只要点击"Rx-WinForms",你就可以写下面的代码:

var ranges = new[]
{
    Observable.Range(1, 255).Select(x => Color.FromArgb(0, 0, x)),
    Observable.Range(1, 254).Select(x => Color.FromArgb(0, 255 - x, x)),
};
var query =
    ranges
        .Concat()
        .Zip(Observable.Interval(TimeSpan.FromMilliseconds(100.0)), (x, i) => x)
        .Repeat()
        .ObserveOn(this);
var subscription = query.Subscribe(c => this.BackColor = c);

所以rangesIObservable<Color>的数组。在ranges上调用.Concat()将其从IObservable<Color>[]变为IObservable<Color>.Zip将每个值绑定到一个以10ms为增量计数的计时器(如果您愿意,可以更改该值)。调用.Repeat()只是不断地重复这个循环——有点像while (true)。然后.ObserveOn(this)强制可观察对象订阅在UI线程上运行。

最后,.Subscribe(...)实际运行可观察对象并更新表单的BackColor

这样做的好处是,您可以随时通过在订阅上调用.Dispose()来停止订阅:
subscription.Dispose();

清理所有线程和计时器。这是一个非常简洁的解决方案。