簡體   English   中英

將Windows窗體顏色從一種更改為另一種

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM