• 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

     

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

  • 相关阅读:
    jpype
    Java获取类中的所有方法
    SQL中INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别
    如何用命令将本地项目上传到git
    Java连接Mysql:通过配置文件
    lsof -i:port_number
    yum install lsof
    Git的基本使用方法(受益匪浅)
    [后端]gitlab之gitlab-ci自动部署
    centos7安装redis-4.0.1集群
  • 原文地址:https://www.cnblogs.com/starwork/p/1179648.html
Copyright © 2020-2023  润新知