2013-03-10 62 views
0

我目前正在追蹤頭一個C#,但每隔一段時間我都會自己玩。我遇到了一個我無法解決的情況。我想從MediumBlue更改this.BackColor以逐步執行綠色0 - 255,並使用按鈕I/O返回控制檯。問題是我無法讓顏色停止步進並返回到MediumBlue。將Windows窗體顏色從一個改爲另一個

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_ClickfClr的值爲1。但是,當我再次點擊它fClr獲得0,但是然後立即再次獲得1。不知道這是否與while (Visible)有關。 ..頭部抓痕..

+0

我仍然不確定你想要完成什麼。你能否包括一些照片? – Neolisk 2013-03-10 22:39:15

+0

[鏈接](http://i.imgur.com/4GuMLfg.jpg)是如何在我的表單設計師。當我點擊'btnClr_Click'(表單顏色)時,它會循環顯示綠色步驟,如[鏈接](http://i.imgur.com/D8he4Tg.jpg)。我正在尋找一種解決方案,當我再次單擊'btnClr_Click'時,'BackColor'將返回到MediumBlue。我不確定爲什麼@ JABFreeware的解決方案不能解決,但它不。 – XMGibbs 2013-03-10 23:27:02

回答

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),則重置紅色並增加綠色。如果超過綠色範圍,我重置綠色並增加藍色。最後,如果超過藍色範圍,我終止該過程。

+0

從一個新的解決方案中看到它,我看到你已經完成了,它可以作爲一個解決方案來逐步通過多種顏色**,但它不會停止任何**。我試圖找出如何將您的解決方案應用於我的原始項目。您的代碼可以加速每次點擊以指數速度進行的步驟。你將如何使用相同的按鈕來停止並返回到原始的BackColor?編輯:我看到一旦它達到某個點它達到終止。這個解決方案回答了這兩個問題謝謝! :) – XMGibbs 2013-03-10 23:57:49

+0

我確實有一個問題,但現在肯定沒有問題;你將如何使用該解決方案到I/O按鈕。簡單地說,點擊它週期並不停止。您必須再次單擊它才能終止。 – XMGibbs 2013-03-11 00:06:19

+0

'private bool _started;'並在按鈕中點擊:'_started =!_started;如果(_started){開始計時器} else {停止計時器;重置背景}'。並且如果'_b> = 256'將其設置爲'0'以便循環而不是終止。 – 2013-03-11 00:23:39

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

謝謝。我明白你的意思。但是'else'語句呢?我如何得到這個工作? – XMGibbs 2013-03-10 22:47:12

+0

我試圖提高你的評論,但我沒有足夠的聲譽來這樣做。而構建仍然會繼續,並重新開始綠色的步驟。簡單地說,它循環並不停止。 – XMGibbs 2013-03-10 22:55:45

相關問題