สีเป็นพื้นหลังโดยใช้รหัส RGB ซึ่งจะเปลี่ยนแปลงตลอดเวลา

Public Class Form1
    Private Sub Timer1_Tick() Handles Timer1.Tick
        Label1.Text = TimeOfDay
        Label2.Text = System.DateTime.Now.ToString("MM/d/yyy")
        Me.BackColor = ColorTranslator.FromHtml("#" & DateAndTime.Now.ToString("HHmmss"))
        Label1.ForeColor = Color.White
        Label2.ForeColor = Color.White
    End Sub
End Class

ในโค้ดของฉันด้านบน สีพื้นหลังจะเปลี่ยนเป็นรหัสสีฐานสิบหกขึ้นอยู่กับเวลา อย่างไรก็ตามฉันต้องการเปลี่ยนสิ่งนี้เนื่องจากสีที่มาพร้อมกับรหัสเหล่านี้มืดเกินไป

แต่ฉันกำลังมองหาโค้ดเพื่อทำให้สีพื้นหลังเป็น % ในคอนเทนเนอร์สีแดง เขียว และน้ำเงิน (สี RGB)

ตัวอย่างเช่น หากเวลาคือ 11:22:33 ฉันต้องการให้สีพื้นหลังเป็นสีแดง 11% สีเขียว 22% และสีน้ำเงิน 33% สิ่งนี้สมเหตุสมผลหรือไม่? ฉันเป็นมือใหม่ และความช่วยเหลือใด ๆ ก็ได้รับการชื่นชมอย่างมาก


person Lilly    schedule 31.12.2014    source แหล่งที่มา


คำตอบ (1)


คุณต้องประมาณค่าระหว่าง 0 ถึง 255 และใช้ค่าที่ประมาณไว้เป็นค่าสีแดง เขียว หรือสีน้ำเงิน แทนที่จะใช้องค์ประกอบเวลาโดยตรง หากคุณต้องการใช้ช่วงสีทั้งหมด เนื่องจากส่วนประกอบของสีจะแสดงอย่างละ 1 ไบต์

โดยทั่วไปคุณขยาย 0-24 ชั่วโมงของคุณเป็นค่า 0-255 โดยที่ Hour=0 สอดคล้องกับ Red=0 และ Hour=24 สอดคล้องกับ Red=255

Dim R As Byte = CByte(Date.Now.Hour / 23 * 255)

ซึ่งค่อนข้างคล้ายกับแนวทาง "11% สีแดง" ของคุณ ส่วนอื่นๆ ก็จะมีการกำหนดคล้ายกันคือ

Dim G As Byte = CByte(Date.Now.Minute / 59 * 255)
Dim B As Byte = CByte(Date.Now.Second / 59 * 255)

สูตรการประมาณค่าเชิงเส้นโดยทั่วไปคือ

New_Value = (Value - Min) / (Max - Min) * (New_Max - New_Min) + New_Min

ที่นี่ Min และ New_Min คือ 0 ซึ่งทำให้สูตรง่ายขึ้นบ้าง

หากต้องการกำหนดสีจริงๆ คุณไม่จำเป็นต้องตั้งค่าโดยใช้การสร้างสี HTML คุณสามารถใช้ฟังก์ชัน Color.FromArgb ได้ เพียงพิมพ์ลงใน Visual Studio ด้วยเหตุผลบางประการ IntelliSense (คุณลักษณะที่แสดงให้คุณเห็นว่ามีวิธีใดบ้างที่พร้อมใช้งานในขณะที่พิมพ์ใน IDE) จึงซ่อนฟังก์ชันไว้ในบางกรณี

Me.BackColor = Color.FromArgb(R, G, B)

นี่ไม่ได้แตกต่างจากวิธี HTML ของคุณ เพียงแค่ง่ายกว่า (ค่า #321224 เป็นเพียงการแสดงสามไบต์ในเลขฐานสิบหก ในรูปแบบของ #RRGGBB)


ในแง่ที่เข้มงวดที่สุด คำตอบข้างต้นไม่ใช่สิ่งที่คุณต้องการใช้อย่างแน่นอน หากต้องการใช้วิธีการตามเปอร์เซ็นต์ คุณจะต้องสร้างค่า RGB เป็น

Dim R As Byte = CByte(Date.Now.Hour / 100 * 255)
Dim G As Byte = CByte(Date.Now.Minute / 100 * 255)
Dim B As Byte = CByte(Date.Now.Second / 100 * 255)

แต่สิ่งนี้จะไม่ทำให้คุณได้ช่วงสีที่สมบูรณ์เช่นกัน (แม้แต่ 59% ของ 255 ก็เป็นเพียง 150 ดังนั้นคุณจะไม่เห็นค่าระหว่าง 150 ถึง 255) การประมาณค่าเชิงเส้นเป็นวิธีที่จะไป

person Jens    schedule 31.12.2014