【问】VB TreeView如何根据Node节点句柄返回其对应的Index?

VBAHZ 2007-04-01 03:53:03
此控件是由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值到底存在哪里,否则的话,只要直接找到偏移地址,取出就行。
...全文
778 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 2007-05-08
  • 打赏
  • 举报
回复
hǎo gāo shēn yà
rainstormmaster 2007-04-28
  • 打赏
  • 举报
回复
根据MS的一贯做法,这个index应该就在节点句柄的附近,至于偏移量到底是多少,我无法准确的告诉你,因为它每打一个补丁,地址一般就发生一次变化
VBAHZ 2007-04-27
  • 打赏
  • 举报
回复
目前 VB5
以后可能会 VB6
原来的对象是来自Common Control 5.0版公用控件的,
但在本功能所需的代码范围内,没有引用 As Node 之类的实体对象,

主要就是想做个能根据输入句柄返回索引值的通用函数而已:)

函数原型类似以下:

Function 请输入句柄,将返回索引号(ByVal 节点句柄 As Long) As Long
...
End Function
rainstormmaster 2007-04-27
  • 打赏
  • 举报
回复
vb5还是vb6?
VBAHZ 2007-04-26
  • 打赏
  • 举报
回复
谢谢,但我要的是索引号,
就像VB控件TreeView1.Nodes(x)中的数值型x
如何根据节点句柄,来返回其Index?
VBAHZ 2007-04-26
  • 打赏
  • 举报
回复
顶楼已写过:

特别申明了,代码中没有对象实体的。
就是说不会出现 As Nodes As TreeView 类型的。
想要用VB直接返回Node对象,恐怕不行。
VBAdvisor 2007-04-26
  • 打赏
  • 举报
回复
有可能不适合你,供参考:
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
嗷嗷叫的老马 2007-04-26
  • 打赏
  • 举报
回复
帮顶..............
VBAdvisor 2007-04-25
  • 打赏
  • 举报
回复
你的意思是取得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

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧