利用API函数向TreeView控件发送消息

前端之家收集整理的这篇文章主要介绍了利用API函数向TreeView控件发送消息前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

版权声明:可以任意转载,转载时请务必以链接形式标明如下文章原始出处和作者信息及本声明

作者:xixi

出处:http://blog.csdn.net/slowgrace/archive/2009/04/15/4076404.aspx

1、SendMessage

向TreeView控件发送消息通常要用API的sendmessge函数,这需要在标准模块里添加声明如下:

'API声明
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal lParam As Long) As Long

这上面两个声明,区别只在最后一个参数。Tiger_Zhao说,前一种是自动取地址,通常对应指针类型的参数。后一种直接传值,通常对应非指针类型的参数。通常,如果MSDN 的参数类型有*,就用前一种。而后一种,实际上可以对应于下面这种调用: Call SendMessage(hTvw,TVM_EXPAND,TVE_EXPAND,ByVal hItem)。在这篇文章里有一个具体的例子。

2、获得TreeView Node对应的HItem

发消息时,常常需要提供的参数之一是TreeView Node对应的HItem。可以像下面这样获得:

Private Function GetHTreeItem(ByVal nodX As MSComctlLib.Node,treX As MSComctlLib.TreeView) As Long
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,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
Public Const TV_FIRST As Long = &H1100
Public Const TVM_GETNEXTITEM As Long = TV_FIRST + 10
Public Const TVM_GETITEM = TV_FIRST + 12
Public Const TVM_EXPAND As Long = TV_FIRST + 2
Public Const TVE_EXPAND As Long = &H2
Public Const TVM_GETITEMRECT = TV_FIRST + 4

参考链接
(1)来自这个帖子的讨论http://topic.csdn.net/u/20090412/21/5cc102c6-f281-4870-a7d6-3755f785c715.html
(2)http://topic.csdn.net/u/20070401/15/be6add3b-a6c6-4179-bd27-d13b8a4bdfe2.html
(3)http://topic.csdn.net/t/20020315/20/579406.html

原文链接:https://www.f2er.com/vb/263147.html

猜你在找的VB相关文章