1
votes

I have successfully implemented this method of using the Win32 API to set the background color of a treeview in VB 6: http://support.microsoft.com/kb/178491

However, one thing goes wrong: when you expand the tree nodes more than two levels deep, the area to the left of (and sometimes under) the inner plus [+] and minus [-] signs is still white.

Does anyone know how to get this area to the correct background color, too?

Note: I'm also setting the BackColor of each node, and also the BackColor of the treeview's imagelist.

Here's my version of the code:

Public Sub TreeView_SetBackgroundColor(TreeView As MSComctlLib.TreeView, BackgroundColor As Long)
    Dim lStyle As Long, Node As MSComctlLib.Node

    For Each Node In TreeView.Nodes
        Node.BackColor = BackgroundColor
    Next

    TreeView.ImageList.BackColor = BackgroundColor

    Call SendMessage( _
        TreeView.hwnd, _
        TVM_SETBKCOLOR, _
        0, _
        ByVal BackgroundColor)

    'Now reset the style so that the tree lines appear properly.
    lStyle = GetWindowLong(TreeView.hwnd, GWL_STYLE)
    Call SetWindowLong(TreeView.hwnd, GWL_STYLE, lStyle - TVS_HASLINES)
    Call SetWindowLong(TreeView.hwnd, GWL_STYLE, lStyle)
End Sub
3
Tried running above function on TreeView_Expand(Node) event, but that didn't seem to have any effect.Zach Blocker
One undesirable solution is to set TreeView.Style = tvwPictureText. This makes the white boxes go away but also the plus/minus signs and the dotted lines. So there's no way to expand/collapse the treeview items except by double-clicking them.Zach Blocker

3 Answers

1
votes

This is a known bug in version 6 of the common controls (mscomctl.ocx). The API routine you're using works fine with version 5 of the common controls (comctl32.dll). The reason is because the mscomctl.ocx is actually a re-write of the common controls that are included with Windows, so there are some known bugs with Windows common controls APIs and themes. (See the introduction to this article: http://vbnet.mvps.org/index.html?code/comctl/tveffects.htm for a much more eloquent explanation).

I've searched before for a solution to this problem, and the only thing I came up with (other than the work-around you already discovered) is to replace the controls in your project with version 5. Remember, this control package also includes the ListView and the ImageList, so you need to replace those with version 5 as well in your project.

Alternatively, you could also try replacing the native control with one from a third-party that adds even more functionality. Though I haven't tried it personally, you may try the following example: http://www.vbaccelerator.com/home/vb/code/controls/TreeView/TreeView_Control/article.asp.

0
votes

Ok, I have found a good-enough-for-now solution of setting the TreeView.Style property to tvwPlusPictureText. This is an improvement over my previous comment (where I set it to tvwPictureText), because I can still expand/collapse nodes.

So, please consider the question still open and let me know if there's a better solution.

0
votes

Included for reference (I did not try this one myself). Appears to be a more low-level subclassing approach:

http://www.bigresource.com/Tracker/Track-vb-h0tV8eVC8M/ (see Iouri's comment)