1,486
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
Private Declare Function GetDlgCtrlID Lib "user32.dll" ( _
ByVal hwnd As Long) As Long
Private Type TVITEM
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
End Type
Private Type NMHDR
hwndFrom As Long
idfrom As Long
code As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type NMTREEVIEW ' was NM_TREEVIEW
Hdr As NMHDR
' Specifies a notification-specific action flag.
' Is NMTREEVIEW_action for TVN_SELCHANGING, TVN_SELCHANGED, TVN_SETDISPINFO
' Is TVM_EXPAND_wParam for TVN_ITEMEXPANDING, TVN_ITEMEXPANDED
Action As Long
itemOld As TVITEM
itemNew As TVITEM
ptDrag As POINTAPI
End Type
Private Const TVN_FIRST As Long = (-400)
Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_EXPAND As Long = (TV_FIRST + 2)
Private Const TVGN_ROOT As Long = &H0
Private Const TVE_TOGGLE As Long = &H3
Private Const TVIF_STATE As Long = &H8
Private Const TVIF_PARAM As Long = &H4
Private Const TVM_GETITEMA As Long = (TV_FIRST + 12)
Private Const TVM_GETITEMW As Long = (TV_FIRST + 62)
Private Const TVGN_CHILD As Long = &H4
Private Const TVM_SELECTITEM As Long = (TV_FIRST + 11)
Private Const TVGN_CARET As Long = &H9
Private Const TVN_SELCHANGEDA As Long = (TVN_FIRST - 2)
Private Const TVN_SELCHANGEDW As Long = (TVN_FIRST - 51)
Private Const TVM_GETTEXTCOLOR As Long = (TV_FIRST + 32)
Private Const WM_NOTIFY As Long = &H4E
Private Sub Form_Load()
TreeView1.LineStyle = tvwRootLines
TreeView1.Nodes.Add , , "R", "Root"
TreeView1.Nodes.Add "R", tvwChild, "A", "A"
TreeView1.Nodes.Add "R", tvwChild, "B", "B"
TreeView1.Nodes.Add "R", tvwChild, "C", "C"
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Debug.Print "NodeClick("; Node.Text & ")"
End Sub
Private Sub Command1_Click()
Dim hItem As Long
Dim tVI As TVITEM
Dim ntv As NMTREEVIEW
'Root
hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&)
Debug.Print Hex(hItem)
SendMessage TreeView1.hwnd, TVM_EXPAND, TVE_TOGGLE, ByVal hItem
'tVI.hItem = hItem
'tVI.mask = TVIF_STATE Or TVIF_PARAM
'SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI
'ntv.itemOld = tVI '没有 itemOld 也是可以的'
'Root\A
hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hItem)
Debug.Print Hex(hItem)
SendMessage TreeView1.hwnd, TVM_SELECTITEM, TVGN_CARET, ByVal hItem
tVI.hItem = hItem
tVI.mask = TVIF_STATE Or TVIF_PARAM
SendMessage TreeView1.hwnd, TVM_GETITEMA, 0, tVI '关键一
ntv.itemNew = tVI
ntv.Hdr.hwndFrom = TreeView1.hwnd
ntv.Hdr.idfrom = GetDlgCtrlID(TreeView1.hwnd)
ntv.Hdr.code = TVN_SELCHANGEDA '关键二
ntv.Action = TVN_SELCHANGEDA '关键三
SendMessage Me.hwnd, WM_NOTIFY, ntv.Hdr.idfrom, ntv
End Sub
Private Sub Command1_Click()
Dim hItem As Long
Dim tVI As TVITEM
Dim ntv As NMTREEVIEW
'Root
hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&)
Debug.Print Hex(hItem)
SendMessage TreeView1.hwnd, TVM_EXPAND, TVE_TOGGLE, ByVal hItem
'tVI.hItem = hItem
'tVI.mask = TVIF_STATE Or TVIF_PARAM
'SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI
'ntv.itemOld = tVI '没有 itemOld 也是可以的'
'Root\A
hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hItem)
Debug.Print Hex(hItem)
SendMessage TreeView1.hwnd, TVM_SELECTITEM, TVGN_CARET, ByVal hItem
tVI.hItem = hItem
tVI.mask = TVIF_STATE Or TVIF_PARAM
SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI
ntv.itemNew = tVI
ntv.hdr.hwndFrom = TreeView1.hwnd
ntv.hdr.idfrom = GetDlgCtrlID(TreeView1.hwnd)
ntv.hdr.code = TVN_SELCHANGED
ntv.action = TVN_SELCHANGED
SendMessage Me.hwnd, WM_NOTIFY, ntv.hdr.idfrom, ntv
End Sub
Private Sub Form_Load()
TreeView1.LineStyle = tvwRootLines
TreeView1.Nodes.Add , , "R", "Root"
TreeView1.Nodes.Add "R", tvwChild, "A", "A"
TreeView1.Nodes.Add "R", tvwChild, "B", "B"
TreeView1.Nodes.Add "R", tvwChild, "C", "C"
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Debug.Print "NodeClick("; Node.Text & ")"
End Sub