更改Combobox中“悬停”项目的文本颜色?

时间:2013-12-02 20:00:44

标签: vb.net winforms visual-studio-2010 .net-2.0

我有一个组合框控件,我将其设置为“下拉列表”样式(因为我不希望用户能够在组合框中键入文本)。可能只是因为我不喜欢“下拉列表”样式的样子,所以我试图将它改为外观,就像正常的组合框样式一样。

所以我将绘制模式设置为“owner draw fixed”。我的目标是为没有悬停的组合框项目设置白色背景/黑色文本,并为悬停在其上的项目设置蓝色背景/白色文本(就像普通的组合框一样)。

背景颜色正常工作,但文字颜色不是(文字保持黑色,即使是悬停在上面的项目)。

这是我的代码......

Private Sub ComboBox1_DrawItem_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem

    Dim TextBrush As Brush

    If (e.State And DrawItemState.HotLight) = DrawItemState.HotLight Then
        TextBrush = Brushes.White
    Else
        TextBrush = Brushes.Black
    End If

    Dim index As Integer = If(e.Index >= 0, e.Index, 0)
    e.DrawBackground()
    e.Graphics.DrawString(ComboBox1.Items(index).ToString(), e.Font, TextBrush, e.Bounds, StringFormat.GenericDefault)
    e.DrawFocusRectangle()

End Sub

有什么想法吗?

我一直在谷歌搜索解决方案几个小时,但到目前为止没有运气。

3 个答案:

答案 0 :(得分:2)

e.State是一个标志集。它的值由OR标志值组成。因此,您需要使用If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then,而不是观察到的785值。

true == 785 == (Selected OR Focus OR NoAccelerator OR NoFocusRect)

如果删除NoFocusRect,整数值将会改变,但位掩码仍将包含Selected的值。

答案 1 :(得分:1)

答案 2 :(得分:1)

这是我如何更改组合框的选定背景颜色和选择文本forecolor

Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
    'create custom color and brush for selection color
    Dim myColor As Color
    Dim myBrush As Brush

    myColor = Color.FromArgb(231, 199, 100)

    myBrush = New SolidBrush(myColor)

    If e.Index < 0 Then Exit Sub

    Dim rect As Rectangle = e.Bounds
    Dim TextBrush As Brush
    Dim index As Integer = If(e.Index >= 0, e.Index, 0)

    If e.State And DrawItemState.Selected Then
        'selection background color
        e.Graphics.FillRectangle(myBrush, rect)
        'selection forecolor
        TextBrush = Brushes.Black
        e.Graphics.DrawString(ComboBox1.Items(index).ToString(), e.Font, TextBrush, e.Bounds, StringFormat.GenericDefault)
    Else
        e.Graphics.FillRectangle(Brushes.Black, rect)
        TextBrush = Brushes.White
        e.Graphics.DrawString(ComboBox1.Items(index).ToString(), e.Font, TextBrush, e.Bounds, StringFormat.GenericDefault)
    End If

End Sub