巧用SendMessage函数扩展Treeview功能

Option Explicit
Private Type TPoint
    x As Long
    y As Long
End Type
Private Type TVHITTESTINFO
    pt As TPoint
    flags As Long
    hItem As Long
End Type
Private Type TVITEM
    mask As Long
    HTreeItem As Long
    state As Long
    stateMask As Long
    pszText As Long
    cchTextMax As Long
    iImage As Long
    iSelectedImage As Long
    cChildren As Long
    lParam As Long
End Type
Const TV_FIRST [color=#0000ff]= &H1100
Const TVM_HITTEST = TV_FIRST + 17
Const TVM_GETITEM = TV_FIRST + 12
Const TVHT_ONITEMLABEL = &H4
Const TVIF_TEXT = &H1
Const GMEM_FIXED = &H0
'设置行高
Const TVM_SETITEMHEIGHT = TV_FIRST + 27
'设置背景色
Const TVM_SETBKCOLOR = TV_FIRST + 29
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As String, ByVal Source As Long, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Dim hItemPrv As Long
Private Sub Form_Load()
    Dim ndX As Node
    '加入若干Item
    Set ndX = TreeView1.Nodes.Add(, , "R", "Root", 1)
    Set ndX = TreeView1.Nodes.Add("R", tvwChild, "Key1", "Node1", 1)
    Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey1", "SubNode1", 3)
    Set ndX = TreeView1.Nodes.Add("SubKey1", tvwChild, "SubKeys1", "SubNode1", 3)
    Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey2", "SubNode2")
    Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey3", "SubNode3")
    Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey4", "SubNode4")
    
  '设置树型列表控件节点行(Node)高度
    Call SendMessage(TreeView1.hwnd, TVM_SETITEMHEIGHT, 30, 0)
  '设置树型列表控件的背景颜色
    Call SendMessage(TreeView1.hwnd, TVM_SETBKCOLOR, 0, RGB(255, 0, 0))
End Sub
'为树型列表控件(Treeview)中不同的节点行(Node)设置不同的Tooltips气泡提示
'在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,
'如果该点位于一个标题上,则返回该标题的句柄。而利用TVM_GETITEM消息,则可以
'根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本.
Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim ptA As TPoint
    Dim tf As TVHITTESTINFO
    Dim TV As TVITEM
    Dim hStr As Long
    Dim hItem As Long
    Dim astr As String * 1024
    Dim bstr
    On Error GoTo errLab
    '获得当前光标所在的位置坐标
    ptA.x = Int(x / Screen.TwipsPerPixelX)
    ptA.y = Int(y / Screen.TwipsPerPixelY)
    tf.pt = ptA
    tf.flags = TVHT_ONITEMLABEL
    '获得光标所在的Item的句柄
    hItem = SendMessage(TreeView1.hwnd, TVM_HITTEST, 0, tf)
    '如果未获得句柄或者同上一次是同一个Item的句柄则退出
    If ((hItem <= 0) or (hItem = hItemPrv)) Then Exit Sub
    hItemPrv = hItem
    '分配一定的内存空间用以存储Item的标题
    hStr = GlobalAlloc(GMEM_FIXED, 1024)
    If hStr > 0 Then
        TV.mask = TVIF_TEXT
        '获取标题文本
        TV.HTreeItem = hItem
        'Item句柄
        TV.pszText = hStr
        TV.cchTextMax = 1023
        '发送TVM_GETITEM获得标题文本
        Call SendMessage(TreeView1.hwnd, TVM_GETITEM, 0, TV)
        '将标题文本拷贝到字符串astr中
        CopyMemory astr, hStr, 1024
        bstr = Left$(astr, (InStr(astr, Chr$(0)) - 1))
        TreeView1.ToolTipText = bstr
        '释放分配的内存空间
        GlobalFree hStr
    End If
    Exit Sub
errLab:
    Resume Next
End Sub
 

相关函数参考


VB 获取Textbox文本框中的行数函数

VBStrConv函数.

VB获取windows各常用目录的函数(模块)

VB:常用内部函数大全,你会了几个呢?

VB后台获得按键,并执行自己的函数(非钩子及热键)

※利用VB函数Dir()实现递归搜索目

※巧用SendMessage函数扩展Treeview功能

※比CopyMemory还要快的函数SuperCopyMemory

VB利用API函数来处理文件

利用VB函数Dir()实现递归搜索目

※利用API函数计算程序运行时间VB

※利用VB函数Dir()实现递归搜索目录

VB Environ系统环境变量函数大全

VB 创建快捷方式函数(可带参数)


VB相关

vbline的用法[]

画图工具的VB实现

VB 一个获得自己外网 IP 地址的程序代码

VB程序中实现IP地址子网掩码网关DNS的更改  []

VB 中应用 FSO 对象模型介绍(摘自网络)

[] VbFSO 对象的介绍

VB 画坐标轴

VB 二进制文件的操作

[VB]BMPJPGVBKeyCode常数用法

vb实时曲线的绘制和保存

VB操作EXCEL

vb初学回顾:最大公约数 最小公倍数 素数求取

vb 关于窗口样式的API以及处理文本的API参考

【引用】在VB6.0中实现弹出式菜单的几种方法

【引用】URLDownloadToFile_VB下载文件!

利用WinRar压缩和解压缩文件

VB 剪切板

VB实现指示窗口中拖动方框的程序

VB绘制走动的表针

如何用VB制作DLL文件

【引用】VB修改IP地址

VB多窗体退出代码

[]VB:如何检测到U盘的插拔(源代码)

巧用SendMessage函数扩展Treeview功能

vb中如何在任务管理器里面隐藏应用程序进程

如何实现VBEXCEL的无缝连接

一个API方式存取日志文件的模块[VB]

VB用记录集填充表格函数

VB打开文本文件各种方法

vb ClipBoard 剪切板应用(复制剪切粘贴)

【引用】窗口处理技巧大全 vb(窗体控件)

【转】 Md rd命令之VB

vb:读写文本文件

vb中实现真正锁定的带自定义菜单的文本控件

【引用】使用CommonDialogShowSave后如何判断是保存还是取消?

vb 关于commondialog的多选VB获取Windows操作系统所有版本

vb UTF文本文件访问

VB编程中的Unicode vs Ansi

VBPiView4注册机

VB获取超过2G文件的大小

CopyMemory还要快的函数SuperCopyMemory

VB:编程效率快步提高之:十七种可用一行代码完成的技巧

VB画出来的五星红旗

Qt第一印象——QteQt  

更多精彩>>>

你可能感兴趣的:(巧用SendMessage函数扩展Treeview功能)