如何使用api获取treeview控件节点数据
展开全部
1、SendMessage
向TreeView控件发送消息通常要用API的sendmessge函数,这需要在标准模块里添加声明如下:
'API声明
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, lParam As Any) AsLong
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, ByVal lParam AsLong) AsLong
这上面两个声明,区别只在最后一个参数。Tiger_Zhao说,前一种是自动取地址,通常对应指针类型的参数。后一种直接传值,通常对应非指针类型的参数。通常,如果MSDN 的参数类型有*,就用前一种。而后一种,实际上可以对应于下面这种调用: Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, ByVal hItem)。在这篇文章里有一个具体的例子。
2、获得TreeView Node对应的HItem
发消息时,常常需要提供的参数之一是TreeView Node对应的HItem。可以像下面这样获得:
PrivateFunction GetHTreeItem(ByVal nodX As MSComctlLib.Node, treX As MSComctlLib.TreeView) AsLong
nodX.Selected =True
GetHTreeItem = SendMessage(treX.hwnd, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
不过,上面的方法中要改变treeview的当前节点。如果不希望改变当前节点的话,可以参考这篇文章里的办法:http://blog.csdn.net/slowgrace/archive/2009/04/16/4083667.aspx
3、向TreeView发送消息使Expand事件发生
Call SendMessage(treX.hwnd, TVM_EXPAND, TVE_EXPAND, ByVal GetHTreeItem(nodX, treX))
4、向TreeView发送消息使NodeClick事件发生
在这个帖子里http://blog.csdn.net/slowgrace/archive/2009/01/14/3772557.aspx,我尝试了发NM_CLICK通知消息的办法,但是不能激发NodeClick事件。解决的办法是找到节点的坐标,向指定坐标发送鼠标down和up消息,参见这篇文章http://blog.csdn.net/slowgrace/archive/2009/04/16/4084299.aspx。不过,这个办法是投递消息,如果需要直接发送消息那种效果,暂时还没找到什么好办法。
5、一些常用的工具
Spy++可用来实时观察窗口句柄和消息。APIVIEWER可用来帮你生成用于VB的API函数声明、类型声明、常量声明。
6、了解和使用API消息的方法
在http://msdn.microsoft.com/en-us/library/cc656648(VS.85).aspx里有所有的treeview控件相关消息。一般在消息的说明里会以表格的形式说明相关的参数。表格分成两列,左列是参数列表,右列是注释。比如像下面这句:
(LPARAM) lParam // = (LPARAM) (HTREEITEM) hItem
Tiger_Zhao解释说,它说明这个名为lParam的参数的用法。它的类型是(LPARAM),所以右边的注释首先有个(LPARAM),这是为了与参数类型匹配进行的强制类型转换,不用管(在VB 中就是Long);而(HTREEITEM) 说明这个参数期待的是一个句柄hItem,句柄在VB中也是Long。
7、一些常用到的常数
'for treeview
PublicConst TV_FIRST AsLong=&H1100
PublicConst TVM_GETNEXTITEM AsLong= TV_FIRST +10
PublicConst TVM_GETITEM = TV_FIRST +12
PublicConst TVM_EXPAND AsLong= TV_FIRST +2
PublicConst TVE_EXPAND AsLong=&H2
PublicConst TVM_GETITEMRECT = TV_FIRST +4
向TreeView控件发送消息通常要用API的sendmessge函数,这需要在标准模块里添加声明如下:
'API声明
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, lParam As Any) AsLong
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, ByVal lParam AsLong) AsLong
这上面两个声明,区别只在最后一个参数。Tiger_Zhao说,前一种是自动取地址,通常对应指针类型的参数。后一种直接传值,通常对应非指针类型的参数。通常,如果MSDN 的参数类型有*,就用前一种。而后一种,实际上可以对应于下面这种调用: Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, ByVal hItem)。在这篇文章里有一个具体的例子。
2、获得TreeView Node对应的HItem
发消息时,常常需要提供的参数之一是TreeView Node对应的HItem。可以像下面这样获得:
PrivateFunction GetHTreeItem(ByVal nodX As MSComctlLib.Node, treX As MSComctlLib.TreeView) AsLong
nodX.Selected =True
GetHTreeItem = SendMessage(treX.hwnd, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
不过,上面的方法中要改变treeview的当前节点。如果不希望改变当前节点的话,可以参考这篇文章里的办法:http://blog.csdn.net/slowgrace/archive/2009/04/16/4083667.aspx
3、向TreeView发送消息使Expand事件发生
Call SendMessage(treX.hwnd, TVM_EXPAND, TVE_EXPAND, ByVal GetHTreeItem(nodX, treX))
4、向TreeView发送消息使NodeClick事件发生
在这个帖子里http://blog.csdn.net/slowgrace/archive/2009/01/14/3772557.aspx,我尝试了发NM_CLICK通知消息的办法,但是不能激发NodeClick事件。解决的办法是找到节点的坐标,向指定坐标发送鼠标down和up消息,参见这篇文章http://blog.csdn.net/slowgrace/archive/2009/04/16/4084299.aspx。不过,这个办法是投递消息,如果需要直接发送消息那种效果,暂时还没找到什么好办法。
5、一些常用的工具
Spy++可用来实时观察窗口句柄和消息。APIVIEWER可用来帮你生成用于VB的API函数声明、类型声明、常量声明。
6、了解和使用API消息的方法
在http://msdn.microsoft.com/en-us/library/cc656648(VS.85).aspx里有所有的treeview控件相关消息。一般在消息的说明里会以表格的形式说明相关的参数。表格分成两列,左列是参数列表,右列是注释。比如像下面这句:
(LPARAM) lParam // = (LPARAM) (HTREEITEM) hItem
Tiger_Zhao解释说,它说明这个名为lParam的参数的用法。它的类型是(LPARAM),所以右边的注释首先有个(LPARAM),这是为了与参数类型匹配进行的强制类型转换,不用管(在VB 中就是Long);而(HTREEITEM) 说明这个参数期待的是一个句柄hItem,句柄在VB中也是Long。
7、一些常用到的常数
'for treeview
PublicConst TV_FIRST AsLong=&H1100
PublicConst TVM_GETNEXTITEM AsLong= TV_FIRST +10
PublicConst TVM_GETITEM = TV_FIRST +12
PublicConst TVM_EXPAND AsLong= TV_FIRST +2
PublicConst TVE_EXPAND AsLong=&H2
PublicConst TVM_GETITEMRECT = TV_FIRST +4
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询