Tipp 0337 Farbige ListBox (TreeView-Steuerelement)
Autor/Einsender:
Datum:
  Angie
07.06.2003
Entwicklungsumgebung:   VB 6
Immer wieder wird die Frage gestellt, wie man die Hintergrundfarbe einzelner Elemente in einer ListBox farblich abgesetzt darstellen kann. Mit der ListBox selbst ist das nicht möglich, aber mit dem TreeView-Steuerelement lässt sich das durchaus realisieren (ab VB 6 ohne API-Funktionen).
Mit dem TreeView-Steuerelement kann man unter anderem jedem einzelnen Element eine individuelle Hintergrund- sowie Schriftfarbe und -Art (z.B. fett oder normal) zuweisen. Auch kann jedem Element ein Symbol zugewiesen werden, plus ein zweites Symbol, das beim Auswählen eines Node-Objekts angezeigt wird.
Weitere Eigenschaften, die bei der ListBox nicht standardmäßig vorhanden aber durchaus mit API-Funktionen machbar sind, wie z.B. die horizontale ScrollBar oder aber auch das Anzeigen eines "überlangen" Textes als ToolTipp, sind Standard-Eigenschaften des TreeView-Steuerelements.
Dieser Tipp zeigt, wie man schon mit einigen der vielen Eigenschaften und Methoden des TreeView-Steuerelements eine farbige Listbox inkl. Abbildungen verwirklichen kann.
 
Option Explicit

Private Sub Form_Load()
  Dim i As Integer

  With cboTVWDesign
    .Clear
    .AddItem "Buch"
    .AddItem "Smily's"
    .AddItem "Standard"
  End With

  With tvwListBox
    .FullRowSelect = True
    .HideSelection = False
    .LabelEdit = tvwManual

    Set .ImageList = imglstTVW

    For i = 1 To 20
      .Nodes.Add Text:="Liste " & i
    Next i
    .Nodes.Item(1).Selected = True
  End With
  DoEvents

  optNodeAdd(0).Tag = "0"
  optNodeAdd(1).Tag = "1"
  optNodeAdd(2).Tag = "2"

  optNodeAdd(1).Value = True

  cboTVWDesign.ListIndex = 0
End Sub

Private Sub cboTVWDesign_Click()
  If tvwListBox.Nodes.Count = 0 Then Exit Sub

  Dim lngBackColor1 As Long
  Dim lngBackColor2 As Long

  Dim lngForeColor1 As Long
  Dim lngForeColor2 As Long

  Dim strImage As String
  Dim strImageSel As String

  Dim nodSibling As Node
  Dim intCnt As Integer

  Select Case cboTVWDesign.ListIndex
    Case 0
      lngBackColor1 = &HC0C0FF
      lngBackColor2 = &HFFFFFF
      lngForeColor1 = &HFF0000
      lngForeColor2 = &HC0&

      strImage = "imgBook1"
      strImageSel = "imgBook2"

    Case 1
      lngBackColor1 = &HFFFFC0
      lngBackColor2 = &HFFFFFF
      lngForeColor1 = &HFF0000
      lngForeColor2 = &HC0&

      strImage = "imgSmily1"
      strImageSel = "imgSmily2"

    Case 2
      lngBackColor1 = vbWindowBackground
      lngForeColor1 = vbWindowText
  End Select

  Set nodSibling = tvwListBox.Nodes(1).Root

  If cboTVWDesign.ListIndex = 2 Then
    tvwListBox.Style = tvwTextOnly

    Do
      nodSibling.BackColor = lngBackColor1
      nodSibling.ForeColor = lngForeColor1
      Set nodSibling = nodSibling.Next
    Loop While Not nodSibling Is Nothing

  Else
    tvwListBox.Style = tvwPictureText
    intCnt = 0

    Do
      intCnt = intCnt + 1
      If intCnt Mod 2 <> 0 Then
        nodSibling.BackColor = lngBackColor1
        nodSibling.ForeColor = lngForeColor1
      Else
        nodSibling.BackColor = lngBackColor2
        nodSibling.ForeColor = lngForeColor2
      End If
      nodSibling.Image = strImage
      nodSibling.SelectedImage = strImageSel
      Set nodSibling = nodSibling.Next
    Loop While Not nodSibling Is Nothing

  End If
  Set nodSibling = Nothing
End Sub

Private Sub cmdAddItem_Click()
  Dim nodX As Node
  Dim nodRelative As Node
  Dim intRelation As Integer

  Dim strNodeText As String
  Dim i As Integer

  Static stboolNodes As Boolean

  If Len(Trim$(txtNodeText.Text)) = 0 Then
    strNodeText = "x-beliebiger neuer Eintrag"
  Else
    strNodeText = txtNodeText.Text
  End If

  With tvwListBox
    If .Nodes.Count > 0 Then
      For i = 0 To 2
        If optNodeAdd(i).Value = True Then
          intRelation = CInt(optNodeAdd(i).Tag)
          Exit For
        End If
      Next i

      Select Case intRelation
        Case 0, 1
          Set nodRelative = .Nodes(1).Root

        Case 2
          If Not tvwListBox.SelectedItem Is Nothing Then
            Set nodRelative = .Nodes(.SelectedItem.Index)
          Else
            MsgBox "Bitte wählen Sie einen Eintrag aus!", _
                  vbInformation, Me.Caption
          End If
      End Select

      If Not nodRelative Is Nothing Then
        Set nodX = .Nodes.Add(Relative:=nodRelative, _
              Relationship:=intRelation, Text:=strNodeText)
      End If

    Else
      stboolNodes = True
      Set nodX = .Nodes.Add(Text:=strNodeText)
    End If
  End With

  If Not nodX Is Nothing Then
    nodX.Selected = True
    nodX.EnsureVisible
  End If

  Set nodRelative = Nothing
  Set nodX = Nothing

  If stboolNodes Then
    stboolNodes = False

    cmdDeleteItem.Enabled = True
    cmdSelectedItem.Enabled = True

    For i = 0 To 2
      optNodeAdd(i).Enabled = True
    Next i
  End If

  If cboTVWDesign.ListIndex <> 2 Then
    cboTVWDesign_Click
  End If
End Sub

Private Sub cmdDeleteItem_Click()
  With tvwListBox
    If Not .SelectedItem Is Nothing Then
      .Nodes.Remove .SelectedItem.Index
    Else
      MsgBox "Sie müssen erst einen Eintrag auswählen!", _
            vbInformation, Me.Caption
    End If

    If .Nodes.Count = 0 Then
      cmdDeleteItem.Enabled = False
      cmdSelectedItem.Enabled = False

      Dim i As Integer
      For i = 0 To 2
        optNodeAdd(i).Enabled = False
      Next i

    Else
      If cboTVWDesign.ListIndex <> 2 Then
        cboTVWDesign_Click
      End If
    End If
  End With
End Sub
 
Weitere Links zum Thema
Farbige Listbox-Einträge

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (7,5 kB) Downloads bisher: [ 3088 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Montag, 29. August 2011