listbox ownerdraw items vb 2008

时间:2011-03-15 08:48:36

标签: .net vb.net winforms listbox ownerdrawn

我需要根据要添加的项目或其包含的文本的文本在列表框中绘制每个项目。然后我需要在列表框的开头放置一个图标,其他两种颜色和图标取决于我指定的单词,例如,

  • 如果该项目包含错误文字, 在...处放置一个错误(16x16px)图标 开始并画出背景 浅红色,粗体文字 深红色。

  • 如果它包含就绪或起始文本,则使用浅橙色背景和深色粗体 蓝色字体文字。

  • 如果它包含ok或成功文本,则使用浅绿色背景和深色粗体 绿色字体文字。

我该怎么做?

修改

这是我已经拥有的,但这段代码似乎无休止地刷新。我需要选择颜色的是e.index的值。我可以将e.index更改为类似于e.stringvalue的somthinf吗?

Private Sub lsbLog_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles lsbLog.DrawItem
        '//Draw the background of the ListBox control for each item.
        '// Create a new Brush and initialize to a Black colored brush
        '// by default.
        e.DrawBackground()
        Dim mybrush = Brushes.Black

        '// Determine the color of the brush to draw each item based on 
        '//the index of the item to draw.
        Select Case e.Index
            Case 0
                mybrush = Brushes.Red
            Case 1
                mybrush = Brushes.Blue
            Case 2
                mybrush = Brushes.Green
        End Select

        '//
        '// Draw the current item text based on the current 
        '// Font and the custom brush settings.
        '//
        e.Graphics.DrawString(lsbLog.Items(e.Index).ToString(), _
                              e.Font, mybrush, e.Bounds, StringFormat.GenericDefault)
        '//
        '// If the ListBox has focus, draw a focus rectangle 
        '// around the selected item.
        '//
        e.DrawFocusRectangle()
        lsbLog.Refresh()
    End Sub

1 个答案:

答案 0 :(得分:1)

回答你的两个具体问题:

  1. 您展示的代码无休止地刷新,因为您最后添加了对Refresh的调用:

    lsbLog.Refresh()
    

    拿出来,你将解决无休止的刷新问题。

  2. 是的,你当然可以测试项目的标题而不是索引,但是没有e.stringvalue这样的属性。您必须以不同的方式实现这一目标,这是您在DrawString致电时已发现并使用的方式:

    lsbLog.Items(e.Index).ToString()
    

    您可能希望做一些比我更复杂的事情,具体取决于项目通常包含的内容。例如,您可能想要检查字符串是否包含关键字,而不是测试是否相等。为了获得更大的灵活性,您可能需要将Select Case替换为If - Else声明。


  3. 因此,稍后进行一些小修改,我最终得到以下代码:

    Private Sub lsbLog_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles lsbLog.DrawItem
        '//Draw the background of the ListBox control for each item.
        '// Create a new Brush and initialize to a Black colored brush
        '// by default.
        e.DrawBackground()
        Dim mybrush As Brush = Brushes.Black
    
        '// Determine the color of the brush to draw each item based on 
        '//the index of the item to draw.
        Select Case lsbLog.Items(e.Index).ToString
            Case "Error"
                mybrush = Brushes.Red
            Case "Ready"
                mybrush = Brushes.Blue
            Case "Success"
                mybrush = Brushes.Green
        End Select
    
        '//
        '// Draw the current item text based on the current 
        '// Font and the custom brush settings.
        '//
        e.Graphics.DrawString(lsbLog.Items(e.Index).ToString(), _
                              e.Font, mybrush, e.Bounds, StringFormat.GenericDefault)
        '//
        '// If the ListBox has focus, draw a focus rectangle 
        '// around the selected item.
        '//
        e.DrawFocusRectangle()
    End Sub
    

    以下是结果:

    ListBox with owner drawn items


    当然,为了完全满足您的要求,您还需要填写每个项目的背景。最好的方法是使用类似下面的内容,但相应地改变画笔颜色:

    e.Graphics.FillRectangle(Brushes.Coral, e.Bounds)