首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

【问】VB TreeView怎么根据Node节点句柄返回其对应的Index

2012-01-24 
【问】VB TreeView如何根据Node节点句柄返回其对应的Index?此控件是由VB封装的(比较烂:)比如说:pItRootSend

【问】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à

热点排行