[英]Changing Windows Form color from one to another
我目前正在关注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,但立即又fClr
1。 不知道这是否与while (Visible)
。 ..Head Scratcher ..
您的问题之一是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);
}
}
}
使用计时器更容易。 这样,您的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),我将重置红色并增加绿色。 如果超出了绿色范围,我将重置绿色并增加蓝色。 最后,如果超出了蓝色范围,则终止该过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.