|
Für TreeView-Steuerelemente bietet Visual Basic keine
BackColor-Eigenschaft an, über die Sie die Hintergrundfläche
durchgehend einfärben könnten. Lediglich ab Visual Basic 6
können Sie die Hintergrundfarbe jedes einzelnen Knotens festlegen.
Wie so oft können Sie aber auch hier auf das API zurückgreifen.
Über die API-Funktion SendMessage
und der Nachricht TVM_SETBKCOLOR
teilen Sie dem TreeView-Steuerelement die gewünschte
Hintergrundfarbe mit. Allerdings hat das TreeView-Steuerelement in
Visual Basic 6 (aus MSCOMCTL.OCX) einen
kleinen Bug, der sich anscheinend nicht beheben lässt: Der
Hintergrund wird teilweise nicht vollständig eingefärbt (siehe
Illustration), wenn die Verzweigungslinien angezeigt werden (Wert
der Style-Eigenschaft größer 4). In Visual Basic
5 (COMCTL32.OCX) gibt es dagegen keine Probleme.
Die notwendigen Deklarationen lauten für beide Versionen gleich:
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Declare Function OleTranslateColor Lib "oleaut32.dll" _
(ByVal lOleColor As Long, ByVal lHPalette As Long, _
ByRef lColorRef As Long) As Long
Private Const TVM_SETBKCOLOR = 4381&
Die API-Funktion OleTranslateColor
benötigen wir, um die Konstanten der Systemfarben in die
tatsächlichen Farbwerte umzusetzen (siehe "Systemfarben-Dolmetscher").
Die Hilfsfunktion für die 5er-Version des
TreeView-Steuerelements kann sich darauf beschränken, die
Hintergrundfarbe der gegebenenfalls verbundenen ImageList auf die
gewünschte Hintergrundfarbe zu setzen, eine übergebene Systemfarbe
gegebenenfalls umzusetzen und die besagte Nachricht abzusenden. Sie
übergeben das betreffende TreeView-Steuerelement und optional die
gewünschte Hintergrundfarbe - voreingestellt ist die Systemfarbe
vbWindowBackground.
Public Sub TreeViewBackColor(tvw As TreeView, _
Optional ByVal BackColor As OLE_COLOR = vbWindowBackground)
Dim nIL As ImageList
Dim nBackColor As Long
With tvw
Set nIL = tvw.ImageList
If Not (nIL Is Nothing) Then
nIL.BackColor = BackColor
End If
OleTranslateColor BackColor, 0&, nBackColor
SendMessage .hwnd, TVM_SETBKCOLOR, 0, ByVal nBackColor
End With
End Sub
Der Aufwand für die 6er-Version des TreeView-Steuerelements ist
dagegen ein wenig höher. Zunächst wird hier ebenfalls die
Hintergrundfarbe der ImageList nachgeführt. Wegen einer weiteren
Unsauberkeit (um nicht von einem weiteren Bug zu sprechen) muss die
Style-Eigenschaft vorübergehend auf 0 gesetzt und nach
dem Senden der Nachricht wieder restauriert werden. Dazu kommt, dass
die Hintergrundflächen der Knoten nicht mehr automatisch mit
eingefärbt werden, da Sie in der 6er-Version ja beliebig einzeln
gesetzt werden können. Über den zusätzlichen optionalen Parameter
NodesBackColor geben Sie an, ob die Knoten nicht eingefärbt werden
sollen (False) - die Voreinstellung ist True. Beim Hinzufügen von
weiteren Knoten nach dem Einfärben sollten Sie daran denken, deren
Hintergrundfarbe ebenfalls auf die Hintergrundfarbe zu setzen. Falls
Sie von der Möglichkeit Gebrauch machen wollen, einzelne Knoten
abweichend einzufärben, werden Sie die Funktion wohl modifizieren
müssen. Da aber die Bedingungen für die Einfärbungen von den
Gegebenheiten Ihrer Anwendung abhängen, lässt sich da kaum ein
allgemeingültiges Beispiel aufzeigen.
Public Sub TreeViewBackColor(tvw As TreeView, _
Optional ByVal BackColor As OLE_COLOR = vbWindowBackground, _
Optional ByVal NodesBackColor As Boolean = True)
Dim nNode As Node
Dim nIL As ImageList
Dim nBackColor As Long
Dim nStyle As Long
With tvw
Set nIL = tvw.ImageList
If Not (nIL Is Nothing) Then
nIL.BackColor = BackColor
End If
nStyle = .Style
OleTranslateColor BackColor, 0&, nBackColor
SendMessage .hwnd, TVM_SETBKCOLOR, 0, ByVal nBackColor
.Style = 0
.Style = nStyle
If NodesBackColor Then
For Each nNode In .Nodes
nNode.BackColor = BackColor
Next nNode
End If
End With
End Sub
|