2014-09-03 11 views
-1

我有一個非常簡單的倒計時計時器。我希望標籤的顏色(數字)隨着計時器滴答而改變。我想從綠色開始,然後在計時器滴答00:00時淡入(過渡)到紅色。將標籤的顏色從1降到另一個

計時器工作的很好,一旦計時器打到00:00,我也可以得到標籤變成紅色。我希望它漸漸消失。這是代碼的一部分。

'handles the label ticking down' 
Private Sub tmrCountdown_Tick(sender As Object, e As EventArgs) Handles tmrCountdown.Tick 
    Dim ts As TimeSpan = TargetDT.Subtract(DateTime.Now) 
    If ts.Milliseconds > 0 Then 
     lblTime.Text = ts.ToString("mm\:ss") 
     lblTime.ForeColor = Color.FromArgb(0, 255, 0) 
    Else 
     lblTime.ForeColor = Color.FromArgb(255, 0, 0) 'changes label color to red when it hits 00:00' 
     'stops the timer once the label reaches 00:00 
     lblTime.Text = "00:00" 


     'Plays sound when timer hits 00:00' 
     My.Computer.Audio.Play(My.Resources.alarm, AudioPlayMode.BackgroundLoop) 
     tmrCountdown.Stop() 

     End If 
End Sub 
+0

淡入你的意思是一個梯度?只需定義其值轉換爲紅色/黃色/綠色的「波段」還有一些中間顏色不直觀。 – Plutonix 2014-09-03 20:44:21

+0

淡入淡出我的意思是,它從一種顏色開始,轉換到另一種顏色。所以它從純綠色變爲純紅色。 – MrGerrm 2014-09-03 20:51:25

+0

那麼,只要減少綠色值,並增加顏色製造商使用的紅色值,因爲時間在0上關閉,即所謂的漸變。 – Plutonix 2014-09-03 20:54:02

回答

2

我知道這是一個古老的線程,但我一直在尋找這樣的一個標籤紅彤彤。爲此,我創建了一個計時器,然後設置一些條件計數器來更改標籤顏色的RGB值。更改率由timer.interval值設置。希望這可以幫助某人。

Public Class AlertWindow 

Dim Red As Integer = 0 
Dim Green As Integer = 0 
Dim Blue As Integer = 0 
Dim CountUp As Boolean = True 

Private Sub AlertWindow_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 


    Timer1.Enabled = True 

End Sub 

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 

    If CountUp = True Then 

     If Red < 253 Then 
      Red = Red + 1 
     Else 
      CountUp = False 
     End If 

    End If 

    If CountUp = False Then 

     If Red > 0 Then 
      Red = Red - 1 
     Else 
      CountUp = True 
     End If 

    End If 

    Label1.ForeColor = Color.FromArgb(Red, Blue, Green) 

End Sub 

末級

+0

我剛剛在很長一段時間內第一次登錄到此帳戶並看到你的答案。我不再需要這個,但謝謝你的回答。我試過了,很好的解決方案:) – MrGerrm 2017-09-07 05:59:56

0

對於淡入可以使用阿爾法參數

例如:

Static Alpha As Integer 

    lblTime.BackColor = Color.FromArgb(Alpha , 255, 0, 0) 

    Alpha += 5 'amount of opacity change for each timer tick 
    If Alpha > 255 Then lblTime.Enabled = False 'finished fade-in 
+0

這絕對有效,但有沒有辦法讓它改變文本的顏色而不是方框?我嘗試將Back.Color更改爲Fore.Color,但它不起作用T_T – MrGerrm 2014-09-03 21:32:20

+0

不幸的是,alpha參數不適用於前面的顏色,因此您可以使用lblTime.ForeColor = Color.FromArgb(0,255,255 - alpha, 255-α)。 – Jala 2014-09-03 22:12:36

+0

這真的很棒!它給了我一個錯誤,雖然一旦阿爾法超出了數字 lblTime.ForeColor = Color.FromArgb(0,0 + Alpha,255 - Alpha,0) 這就是我所擁有的,它是從綠色到紅色像我一樣但是當它變成紅色255時,它會給出錯誤並說: 「260'的值對'紅'無效,'紅'應該大於或等於0且小於或等於255 「。 – MrGerrm 2014-09-03 22:32:58

0

這工作得更好時,你可以平均的顏色放在一起。

你必須制定出什麼樣的價值基礎上的計時器的時間間隔要用於計時單位計數:

Private tickCount As Integer = 100 
Private tickValue As Integer = 0 

Private Sub tmrCountdown_Tick(sender As Object, e As EventArgs) _ 
           Handles tmrCountdown.Tick 
    If tickValue > tickCount Then 
    tmrCountdown.Stop() 
    tickValue = 0 
    Else 
    lblTime.ForeColor = AvgColor(Color.Green, Color.Red, tickValue, tickCount) 
    tickValue += 1 
    End If 
End Sub 

Private Function AvgColor(startColor As Color, 
          finalColor As Color, 
          colorValue As Integer, 
          colorCount As Integer) As Color 
    Dim r1 As Integer = startColor.R 
    Dim g1 As Integer = startColor.G 
    Dim b1 As Integer = startColor.B 

    Dim r2 As Integer = finalColor.R 
    Dim g2 As Integer = finalColor.G 
    Dim b2 As Integer = finalColor.B 

    Dim avgR As Integer = r1 + ((r2 - r1) * colorValue)/colorCount 
    Dim avgG As Integer = g1 + ((g2 - g1) * colorValue)/colorCount 
    Dim avgB As Integer = b1 + ((b2 - b1) * colorValue)/colorCount 

    Return Color.FromArgb(avgR, avgG, avgB) 
End Function 
相關問題