【问】VB TreeView如何根据Node节点句柄返回其对应的Index?
此控件是由VB封装的(比较烂:)
比如说:pItRoot = SendMessage(m_hWnd, TVM_GetNextItem, TVGN_Root, ByVal 0)
这样得到了根节点的句柄,但它并不一定对应TreeView1.Nodes(1)
现在问题就是,如何根据节点句柄,来返回其Index?
(主要是偶不知道VB是如何维护Node数据的,不知道节点Index放在哪里,偶估计它可能不是动态检索得出的索引,而是由链表什么的组成???)
(PS:考虑到通用封装性,代码中并没有TreeView的实体对象,
也就是无法使用TreeView1.Nodes(N)的办法,来引用到实体对象,
这样就可以处理其它进程中的TreeView对象了,
现只知道该控件句柄,和正在处理的节点句柄,只需要返回其Index就可)
==========================================
特别申明了,代码中没有对象实体的。
就是说不会出现 As Nodes As TreeView 类型的。
想要用VB直接返回Node对象,恐怕不行。
也许该直接接管更底层的索引链表?
(主要是从效率方面考虑,如果Nodes的数量很大,
而我们仅仅需要一个索引号,这样时间白白浪费在了VB的不断创建与撤销Node对象上了,
况且,有时还要跨进程取索引,直接使用对象实体的话,恐怕。。。)
==========================================
现在没有对象实体啊,没有引用MSComctlLib库
这段代码的作用仅仅是根据输入的控件句柄和节点句柄返回其Index
在其内部,应该不会出现Set语句(因为没有实体对象)
偶不知道其Index值到底存在哪里,否则的话,只要直接找到偏移地址,取出就行。
[解决办法]
你的意思是取得lParam吧?m_hTreeView是treeview1.hwnd,参数是hNode,返回值lParam。
调用:
1。Private Function pvTVGetSelected() As Long
pvTVGetSelected = SendMessageLong(m_hTreeView, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
Call pvTVGetlParam(pvTVGetSelected(), lParam)
2。Call pvTVGetlParam(hNodeParent, lParentParam)
3。Call pvTVGetlParam(hNode, lParam)
Private Function pvTVGetlParam(ByVal hNode As Long, lParam As Long) As Boolean
Dim uTVI As TVITEM
With uTVI
.hItem = hNode
.mask = TVIF_PARAM
End With
pvTVGetlParam = SendMessage(m_hTreeView, TVM_GETITEM, 0, uTVI)
lParam = uTVI.lParam
End Function
[解决办法]
有可能不适合你,供参考:
Public Function NodeAbsoluteIndex(ByVal Node As MSComctlLib.Node) As Long
Dim oNode As MSComctlLib.Node
Dim lCount As Long
lCount = 1
If Not (Node Is Node.FirstSibling) Then
Set oNode = Node.Previous
Do While Not (oNode Is Nothing)
lCount = lCount + pNodeCountChildren(oNode, False, True) + 1
Set oNode = oNode.Previous
Loop
End If
Set oNode = Node.Parent
If Not (oNode Is Nothing) Then
lCount = lCount + NodeAbsoluteIndex(oNode)
End If
NodeAbsoluteIndex = lCount
End Function
Private Function pNodeCountChildren(ByVal Node As MSComctlLib.Node, ByVal VisibleOnly As Boolean, ByVal ForceExpanded As Boolean) As Long
Dim lCount As Long
If Node.Expanded Or ForceExpanded Then
Set Node = Node.Child
Do While Not (Node Is Nothing)
lCount = lCount + pNodeCountChildren(Node, VisibleOnly, ForceExpanded) + Abs(Node.Visible Or Not VisibleOnly)
Set Node = Node.Next
Loop
End If
pNodeCountChildren = lCount
End Function
[解决办法]
帮顶..............
[解决办法]
vb5还是vb6?
------解决方案--------------------
根据MS的一贯做法,这个index应该就在节点句柄的附近,至于偏移量到底是多少,我无法准确的告诉你,因为它每打一个补丁,地址一般就发生一次变化
[解决办法]
hǎo gāo shēn yà