标签背景颜色混合

时间:2019-12-30 10:52:32

标签: vb.net random background-color

我有三个标签和一个按钮。我想将label1和label2的背景颜色随机化,条件是label1和label2的颜色不相同,并且单击按钮,我想获得label3背景色,它是label1颜色和label2颜色。 在我的代码中,我有一些颜色的颜色列表。 我想随机化仅包含在我的颜色列表中的颜色 谢谢您的帮助

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Create a List
    Dim colorList As New List(Of SolidBrush)

    ' Add colors to it
    'red
    colorList.Add(New SolidBrush(Color.FromArgb(100, 255, 0, 0)))
    'white
    colorList.Add(New SolidBrush(Color.FromArgb(100, 255, 255, 255)))
    'Blue 
    colorList.Add(New SolidBrush(Color.FromArgb(100, 0, 0, 255)))
    'Yellow 
    colorList.Add(New SolidBrush(Color.FromArgb(100, 244, 255, 16)))
    'Green 
    colorList.Add(New SolidBrush(Color.FromArgb(100, 0, 255, 0)))
    'Pink 
    colorList.Add(New SolidBrush(Color.FromArgb(100, 255, 16, 22)))
    'Brown 
    colorList.Add(New SolidBrush(Color.FromArgb(100, 120, 37, 37)))
    Dim rnd = New Random()

    ' Get a random item from the list between 0 and list count
    Dim randomColour = colorList(rnd.Next(0, colorList.Count))
    Dim randomColour1 = colorList(rnd.Next(0, colorList.Count))

    ' Assign the color to the label

    Label1.BackColor = randomColour.Color
    Label1.Text = randomColour.Color.Name.ToString
    Label2.BackColor = randomColour1.Color
    Label3.BackColor = (Color.FromArgb(Label1.BackColor.ToArgb + Label2.BackColor.ToArgb))
End Sub

1 个答案:

答案 0 :(得分:1)

您不应每次单击都创建一个新的Random类。只需创建一个类级别的变量即可。 混合颜色将获取颜色的每个分量(R,G,B)并取平均值。然后根据平均值创建新的颜色。 其余的很容易说明。

您只需要一个颜色列表

Private rnd As New Random()

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim colorList As New List(Of Color)
    ' Add colors to it
    'red
    colorList.Add(Color.FromArgb(255, 0, 0))
    'white
    colorList.Add(Color.FromArgb(255, 255, 255))
    'Blue 
    colorList.Add(Color.FromArgb(0, 0, 255))
    'Yellow 
    colorList.Add(Color.FromArgb(244, 255, 16))
    'Green 
    colorList.Add(Color.FromArgb(0, 255, 0))
    'Pink 
    colorList.Add(Color.FromArgb(255, 16, 22))
    'Brown 
    colorList.Add(Color.FromArgb(120, 37, 37))
    ' Get a random item from the list between 0 and list count
    Dim randomColour = colorList(rnd.Next(0, colorList.Count))
    Dim randomColour1 = colorList(rnd.Next(0, colorList.Count))
    ' Get the name of the color to display in the label
    Dim ColorName1 As String = GetColorName(randomColour.Name)
    Dim ColorName2 As String = GetColorName(randomColour1.Name)
    'Set the text color depending on the back color
    If ColorName1 = "White" OrElse ColorName1 = "Yellow" Then
        Label1.ForeColor = Color.Black
    Else
        Label1.ForeColor = Color.White
    End If
    If ColorName2 = "White" OrElse ColorName2 = "Yellow" Then
        Label2.ForeColor = Color.Black
    Else
        Label2.ForeColor = Color.White
    End If
   'Set the back color and text of the labels.
    Label1.BackColor = randomColour
    Label1.Text = ColorName1
    Label2.BackColor = randomColour1
    Label2.Text = ColorName2
    Label3.BackColor = MixColors(randomColour, randomColour1)
End Sub

Private Function MixColors(Color1 As Color, Color2 As Color) As Color
    Dim r As Byte = CByte((Color1.R * 0.5) + (Color2.R * 0.5))
    Dim g As Byte = CByte((Color1.G * 0.5) + (Color2.G * 0.5))
    Dim b As Byte = CByte((Color1.B * 0.5) + (Color2.B * 0.5))
    Return Color.FromArgb(r, g, b)
End Function

Private Function GetColorName(name As String) As String
    Select Case name
        Case "ffff0000"
            Return "Red"
        Case "ffffffff"
            Return "White"
        Case "ff0000ff"
            Return "Blue"
        Case "fff4ff10"
            Return "Yellow"
        Case "ff00ff00"
            Return "Green"
        Case "ffff1016"
            Return "Pink"
        Case "ff782525"
            Return "Brown"
        Case Else
            Return "No match"
    End Select
End Function