VB6:从Comctl.dll中加载TREEVIEW并美化OCX版本(修正)



给个图片及下载,大家多提意见!
.

.

,


,


下载测试:

NEW:
https://files.cnblogs.com/starwork/dsTreeView2.rar

OLD:

https://files.cnblogs.com/starwork/dsTreeView.rar



付一个加载TREEVIEW的方法:

新建一个自定义控件: MYTreeView,UserControl.AutoRedraw = True,UserControl.ScaleMode =3

MYTreeView代码开始:

Option Explicit

Private hTree As Long
Private iNodes As Long

Private Const ID_TREEVIEW = 1000

Private Type TvwNode
    hItem As Long
    hParent As Long
    Index As Long
    Key As String
    Text As String

    Tag As String
End Type

Private NodeX() As TvwNode

Public Enum RelationConstants
    tvwSort
    tvwFirst
    tvwLast
    tvwChild
End Enum

Private Const TV_FIRST = &H1100
Private Const TVM_GETITEM = (TV_FIRST + 12)
Private Const TVM_GETNEXTITEM = (TV_FIRST + 10)
Private Const TVM_INSERTITEM = (TV_FIRST + 0)
Private Const TVM_SETITEM = (TV_FIRST + 13)

Private Const TVM_DELETEITEM = (TV_FIRST + 1)

Private Const TVS_HASBUTTONS = &H1
Private Const TVS_HASLINES = &H2
Private Const TVS_LINESATROOT = &H4

Private Const TVM_GETCOUNT = (TV_FIRST + 5)

Private Const TVIF_PARAM = &H4

Private Const TVIF_STATE = &H8
Private Const TVIF_TEXT = &H1

Private Const WS_BORDER = &H800000
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000

Private Type TVITEMEX
    mask As Long
    hItem As Long
    State As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    iSelectedImage As Long
    cChildren As Long
    lParam As Long
    iIntegral As Long
End Type

Private Type TVINSERTSTRUCT
    hParent As Long
    hInsertAfter As Long
    Item As TVITEMEX
End Type

Private Const TVI_ROOT = &HFFFF0000
Const TVGN_PARENT As Long = &H3

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
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
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (ByRef icx As tagINITCOMMONCONTROLSEX) As Long

Private Type tagINITCOMMONCONTROLSEX
    Size As Long
    InitWhat As Long
End Type

Private Const ICC_TREEVIEW_CLASSES = 2&

Private Sub CreateTree(hParent As Long)
    Dim hCont As Long
    hCont = CreateWindowEx(0&, "STATIC", "bTreeViewClass", WS_BORDER Or WS_VISIBLE Or WS_CHILD, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight, hParent, 0, App.hInstance, 0)
    hTree = CreateWindowEx(0&, "SysTreeView32", "", WS_VISIBLE Or WS_CHILD Or TVS_HASLINES Or TVS_HASBUTTONS Or TVS_LINESATROOT, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight, hCont, ID_TREEVIEW, App.hInstance, 0)

End Sub

Public Function TvwAddItem(hRelItem As Long, Relation As Long, Text As String) As Long

    Dim TVIN As TVINSERTSTRUCT, hRel As Long, TVI As TVITEMEX

    If hRelItem = 0 Then hRelItem = 0&

    If TypeName(hRelItem) = "Long" Then
        hRel = hRelItem

    End If

    TVIN.hParent = hRel

    TVIN.Item.mask = TVIF_TEXT Or TVIF_STATE
    TVIN.Item.pszText = Text & Chr$(0)
    TVIN.Item.cchTextMax = Len(Text) + 1

    If Relation = tvwChild Then
        TVIN.hParent = SendMessageLong(hTree, TVM_GETNEXTITEM, TVGN_PARENT, hRel)

    End If

    hRel = SendMessage(hTree, TVM_INSERTITEM, 0, TVIN)

    If hRel <> 0 Then

        SendMessage hTree, TVM_GETITEM, hRel, TVI
        TVI.mask = TVIF_PARAM
        TVI.lParam = hRel
        SendMessage hTree, TVM_SETITEM, hRel, TVI

        ReDim Preserve NodeX(iNodes)

        iNodes = iNodes + 1

    End If

    TvwAddItem = hRel

End Function

Public Function GetCount() As Long

    GetCount = SendMessage(hTree, TVM_GETCOUNT, TVGN_PARENT, &O0)

End Function

Public Sub ClearTree()
    LockWindow True, frmMain
    SendMessageLong hTree, TVM_DELETEITEM, 0, TVI_ROOT
    LockWindow False, frmMain
End Sub

Private Sub UserControl_Initialize()
    Dim icx As tagINITCOMMONCONTROLSEX

    icx.Size = Len(icx)
    icx.InitWhat = ICC_TREEVIEW_CLASSES

    InitCommonControlsEx icx

End Sub

Private Sub UserControl_Resize()
    CreateTree UserControl.hwnd
End Sub

 

加一个窗体:frmMain

放上Command1,及一个MYTreeView

代码开始:

Option Explicit
Dim LastParent As Long

Private Sub Command1_Click()
    DoLog MYTreeView1, "ABC", False, True
End Sub

Public Sub DoLog(tView As MYTreeView, LogText As String, IsChild As Boolean, Optional AddDate As Boolean = False)
    With tView
        If IsChild = False Then
            LastParent = tView.TvwAddItem(0, 0, LogText)
            If AddDate Then DoLog tView, "Time: " & Now, True, False
    End With
End Sub

 

以上为简单例子,希望大家做出更漂亮的效果来!谢谢!

原文地址:https://www.cnblogs.com/starwork/p/1179648.html