王朝网络
分享
 
 
 

SENDMESSAGE函数巧应用

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows资源管理器中的目录列表。在VB中,树型列表控件包含在Microsoft Windows Common Control 6.0(也可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,有一系列的以TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一些应用。

1、设置树型列表控件的背景颜色

首先做如下的定义:

Private Declare Function SendMessage Lib "user32" Alias "Send MessageA" (ByVal hwnd As Long,ByVal wMsg As Long, ByVal wParam As Long,ByVal lParam As Long) As Long

Const TV-FIRST = &H1100

Const 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类型,关于这个问题,我会在最后的一章中做介绍。

2、设置树型列表控件标题行高度

利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下:

定义:

Const TV_FIRST = &H1100

Const 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

调用:

CallSendMessage(TreeView1.hwnd, TVM-SETITEMHEIGHT, 60, 0)

上面的代码将TreeView1的标题行高度设置到60像素高

3、为树型列表控件中不同的标题行设置不同的提示

在第一期的ListBox控件介绍中,我向大家介绍了如何为列表中的每一个标题行设置不同的提示(ToolTips),在这里为要向大家介绍如何为树型列表控件中的每一个标题设置不同的提示。

同ListBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。而利用TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本。具体的范例代码如下:

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 = &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

Private Declare Function Send MessageRef 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")

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 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 = SendMessageRef(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获得标题文本

CallSendMessageRef(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

运行上面的程序,当光标在TreeView1上面移动时,TreeView1的ToolTips就会根据光标所在的不同标题行而变动。

以上程序在Win98、Win2000,VB6下运行通过

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有