欢迎光临:
  
  非常感谢您光临枕善居。本站是一个免费的基于VB,VB.NET源代码交流的平台,为大家提供优质的专业的源代码,如果您有需要,本站可以帮助在业余时间里给您寻找代码。当然,如果您有好的代码也可以在本站发布,共享给大家。
专业VB和.NET源码、编程开发教程、图标资源、USB电脑遥控器、智能家电控制开关....更多东东请进入我的淘宝小店--->
VB及.NET新源码2011(3DVD,控件+资源) 智能多路控制(串口编程开关) 带源码!


07-10
22

巧用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及.NET源码博客
网址http://www.mndsoft.com/blog/
【VB和.NET专业源码+解决方案+数据字典DVD(全国包快递)】 代码清单 购买后可以享受认证VIP会员及免费获取破解控件补丁



回复回复ahuatian2008 [2008-01-27 01:13:18 |  | del]
谢谢!!学习中。。。。。。。。。
回复回复lign888 [2007-11-04 10:30:36 |  | del]
能发表关于sendmessage函数参数详细用法,特别是第3,4参数
回复回复MagicHu [2007-10-25 19:09:36 |  | del]
1000,等待中,不知道是什么惊人的开源,
回复回复towerbit [2007-10-24 12:45:20 |  | del]
VB自带的Treeview 通过子类化,也可以以实现背景图片的功能.
回复回复habin [2007-10-22 16:38:03 |  | del]
部分背景改变不了[sad]
回复回复YiDie [2007-10-22 14:07:52 |  | del]
'跟这个作用一样的。
Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim itmN As Node
    Set itmN = TreeView1.HitTest(x, y)
    If Not itmN Is Nothing Then
        TreeView1.ToolTipText = itmN.Text
    End If
End Sub
回复回复Mndsoft [2007-10-22 13:17:51 |  | del]
效果图,可以先看看这个,这个是一个第三方控件,可以实现真彩色图标,背景颜色和图片。呵呵,如果用VB自带的Treeview能做到就好了。
查看图片.
引用来自 废客泉 引用来自 废客泉
有没有效果图.
回复回复废客泉 [2007-10-22 11:46:15 |  | del]
有没有效果图.
回复回复wxhanshan [2007-10-22 11:29:26 |  | del]
我正找这个东西
发表评论
您没有权限发表评论!