SendMessage函数应用(三) 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列?br /> ?TreeView)控件的功能。相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows资源管理器中的目录列表。而在VB中,树型列表控件包含在Microsoft Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,有一系列的以TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一些应用 1、设置树型列表控件的背景颜色首先做如下的定义:Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _(ByVal hwnd As Long, _ByVal wMsg As Long, _ByVal wParam As Long, _ByVal lParam As Long) As LongConst TV_FIRST = &H1100Const TVM_SETBKCOLOR = TV_FIRST + 29然后再做如下调用:Call SendMessage(TreeView1.hwnd, TVM_SETBKCOLOR, 0, RGB(255, 0, 0))上面的SendMessage调用将TreeView1的背景颜色设置为红色。大家可能注意到了。在上面的Sendmessage函数定义中,我们将lParam定义为 ByVal lParam As Long,而不是象前面的那些范例那样定义为Any或者String类型,关于这个问题,我会在最?br />蟮囊徽轮凶鼋樯堋?2、设置树型列表控件标题行高度利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下?br />?br>定义:Const TV_FIRST = &H1100Const TVM_SETITEMHEIGHT = TV_FIRST + 27 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调用:Call SendMessage(TreeView1.hwnd, TVM_SETITEMHEIGHT, 60, 0)上面的代码将TreeView1的标题行高度设置到60像素高 3、为树型列表控件中不同的标题行设置不同的提示在第一期的ListBox控件介绍中,我向大家介绍了如何为列表中的每一个标题行设置不?br /> 奶崾?ToolTips),在这里为要向大家介绍如何为树型列表控件中的每一个标题设置不同?br /> 奶崾尽M琇istBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。 而利用TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个?br />⒖梢曰袢」獗晁诒晏庑械谋晏馕谋尽>咛宓姆独肴缦拢?Option Explicit Private Type TPointx As Longy As LongEnd Type Private Type TVHITTESTINFOpt As TPointflags As LonghItem As LongEnd Type Private Type TVITEMmask As LongHTreeItem As Longstate As LongstateMask As LongpszText As LongcchTextMax As LongiImage As LongiSelectedImage As LongcChildren As LonglParam As LongEnd Type Const TV_FIRST = &H1100Const TVM_HITTEST = TV_FIRST + 17Const TVM_GETITEM = TV_FIRST + 12Const TVHT_ONITEMLABEL = &H4Const TVIF_TEXT = &H1Const GMEM_FIXED = &H0 Private Declare Function SendMessageRef Lib "user32" Alias "SendMessageA" _(ByVal hwnd As Long, _ByVal wMsg As Long, _ByVal wParam As Long, _lParam As Any) As LongPrivate 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 LongPrivate Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Dim hItemPrv As Long Private Sub Form_Load()Dim ndX As Node'加入若干ItemSet ndX = TreeView1.Nodes.Add(, , "R", "Root")Set ndX = TreeView1.Nodes.Add("R", tvwChild, "Key1", "Node1")Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey1", "SubNode1")Set ndX = TreeView1.Nodes.Add("SubKey1", tvwChild, "SubKeys1", "SubNode1")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")End Sub Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, _x As Single, y As Single)Dim ptA As TPointDim tf As TVHITTESTINFODim tv As TVITEMDim hStr As LongDim hItem As LongDim astr As String * 1024Dim bstrOn Error GoTo errLab'获得当前光标所在的位置坐标ptA.x = Int(x / Screen.TwipsPerPixelX)ptA.y = Int(y / Screen.TwipsPerPixelY)tf.pt = ptAtf.flags = TVHT_ONITEMLABEL'获得光标所在的Item的句柄hItem = SendMessageRef(TreeView1.hwnd, TVM_HITTEST, 0, tf)'如果未获得句柄或者同上一次是同一个Item的句柄则退出If ((hItem <= 0) Or (hItem = hItemPrv)) Then Exit SubhItemPrv = hItem'分配一定的内存空间用以存储Item的标题hStr = GlobalAlloc(GMEM_FIXED, 1024)If hStr > 0 Thentv.mask = TVIF_TEXT '获取标题文本tv.HTreeItem = hItem 'Item句柄tv.pszText = hStrtv.cchTextMax = 1023'发送TVM_GETITEM获得标题文本Call SendMessageRef(TreeView1.hwnd, TVM_GETITEM, 0, tv)'将标题文本拷贝到字符串astr中CopyMemory astr, hStr, 1024bstr = Left$(astr, (InStr(astr, Chr(0)) - 1))TreeView1.ToolTipText = bstr'释放分配的内存空间GlobalFree hStrEnd IfExit SuberrLab:Resume NextEnd Sub 运行上面的程序,当光标在TreeView1上面移动时,TreeView1的ToolTips就会根据光标所在的不同标题行而变动。以上程序在Win98、Win2000,VB6下编写运行通过。

评论