消息传递在VB中的应用

 有些窗体在设计时会定义一些特殊的功能消息,而当我们传递这些消息给这类窗体时,这类窗口就会执行某段程序,并返回执行的结果。为了让程序可以送出消息,提供了SendMessageAPI函数。

DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"AsLong

hWnd:接收消息的窗口;

wMsg:消息的编号;

wParam:消息的第一个参数;

lParam:消息的第二个参数。

wParam及lParam参数的意义会随着wMsg参数而变,因此我们要传递消息给某一个窗体时,除了了解该消息的意义外,还要了解wParam及lparam的意义。

lParam参数在SendMessage定义句中为"lParamAsAny",因此它有以下几中写法:

当数值为0时,写成:ByVal0&

当为字符串常数时,写成:ByVal"字符串的内容"

当为字符串变量时,写成:ByValS

第一个实例:对窗体进行操作

下面我们对窗体的几个消息进行解释和应用:WM_GETTEXT:读取窗体的Caption属性;WMSETTEXT:设置窗体的Caption属性;WM_SYSCOMMAND:将窗体的属性设置为2;WM_SYSCOMMAND:将窗体的属性设置为1;WM_SYSCOMMAND:将窗体的属性设置为0;WM_SYSCOMMAND:Unload窗体.

下面我们在窗体上放置几个Command控件和一个Text控件:

我们先把所需要的参数和API函数定义到模块里面:

PublicConstWM_SYSCOMMAND=&H112
PublicConstSC_CLOSE=&HF060&注释:关闭窗体
PublicConstSC_MINIMIZE=&HF020&注释:最小化窗体
PublicConstSC_MAXIMIZE=&HF030&注释:最大化窗体
PublicConstSC_RESTORE=&HF120&注释:恢复窗体大小
PublicConstWM_SETTEXT=&HC注释:设置窗体的Caption
PublicConstWM_GETTEXT=&HD注释:取得窗体的caption
DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"AsLong
双击Command中放入:
PrivateSubCommand_Click
DimSAsString
S=String)

SelectCaseIndex
Case0
SendMessageMe.hwnd,WM_GETTEXT,Len,ByValS注释:读出窗体的Caption
Text1.Text=Left)-1)
Case1
注释:因为Text1.text属于Variant类型,所以一定先要用CStr把它转换成字符串
SendMessageMe.hwnd,WM_SETTEXT,0,ByValCStr注释:设置窗体的Caption
Case2
SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,ByVal0&注释:使窗体最大化
Case3
SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MINIMIZE,ByVal0&注释:使窗体最小化
Case4
SendMessageMe.hwnd,WM_SYSCOMMAND,SC_RESTORE,ByVal0&注释:使窗体恢复原来的大小
Case5
SendMessageMe.hwnd,WM_SYSCOMMAND,SC_CLOSE,ByVal0&注释:关闭窗体
EndSelect

EndSub

第二个实例:TextBox的消息

消息用途
EM_LINESCROLL以行为单位,卷动TexBox
EM_SCROLL以行或页为单位,卷动TexBox
EM_GETLINECOUNT读取TextBox的总行数
EM_GETLINE读取某一行的字符串
EM_LINEINDEX读取某一行的第一个字符在TextBox中的索引
EM_LINELENGTH读取某一字符索引所在行次的"行字符数"
EM_CHARFROMPOS读取鼠标所在位置的字符索引
EM_SETSEL设置选取区域

在窗体上放置好相应的控件,如下:

在模块中定义好所需要的变量和函数:

PublicConstEM_SCROLL=&HB5注释:以行或页为单位,卷动TexBox
PublicConstSB_LINEUP=0注释:上卷一行
PublicConstSB_LINEDOWN=1注释:下卷一行
PublicConstSB_PAGEUP=2注释:上卷一页
PublicConstSB_PAGEDOWN=3注释:下卷一页
PublicConstEM_LINESCROLL=&HB6注释:以行为单位,卷动TexBox
DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"AsLong

双击Command,写入以下代码:

PrivateSubCommand_Click
SelectCaseIndex
Case0
SendMessageText1.hwnd,EM_SCROLL,SB_PAGEUP,ByVal0&注释:上卷一页
Case1
SendMessageText1.hwnd,EM_SCROLL,SB_LINEUP,ByVal0&注释:上卷一行
Case2
SendMessageText1.hwnd,EM_SCROLL,SB_LINEDOWN,ByVal0&注释:下卷一行
Case3
SendMessageText1.hwnd,EM_SCROLL,SB_PAGEDOWN,ByVal0&注释:下卷一页
Case4
注释:Text1.text用来输入水平方向行数的TextBox,Text2.text:用来输入垂直方向行数的TextBox
注释:因为lParam采用"AsAny"的定义方式,所以我们传入是一定要将参数强制设置成Long类型
SendMessageText1.hwnd,EM_LINESCROLL,Val,ByValCLng)
EndSelect
EndSub

第三个实例:ListBox的消息

消息用途
LB_SELECTSTRING选取开头含有某个字符串的选项
LB_FINDSTRING搜寻开头含有某个字符串的选项
LB_FINDSTRINGEXACT搜寻完全相符的选项
SETHORIZONTALEXTENT设置水平滚动条的宽度
LB_ITEMFROMPOINT检测鼠标所在位置的选项

下面我们用一个例子来说明这些消息的具体用法:

在窗体上放置好一个Lable,Text,List,三个Command控件.并在List控件中输入字母,且最少有一行要超出List的水平宽度。

在模块中定义相应的参数和函数:

OptionExplicit
PublicConstLB_FINDSTRING=&H18F注释:搜寻开头含有某个字符串的选项
PublicConstLB_FINDSTRINGEXACT=&H1A2‘搜寻完全相同的字符串的选项
PublicConstLB_ITEMFROMPOINT=&H1A9注释:检测鼠标所在的位置的选项

PublicConstWM_USER=&H400
PublicConstLB_GETITEMHEIGHT=注释:取得List的行间高度
PublicConstLB_SETITEMHEIGHT=&H1A0注释:设置得List的行间高度
PublicConstWM_SETREDRAW=&HB

PublicConstLB_SETHORIZONTALEXTENT=&H194注释:设置水平滚动条
DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"AsLong
在Text1_Change中加入如下代码:
PrivateSubText1_Change
DimSearchAsString,IndexAsLong

Search=Text1.Text
IfLen>0Then
Index=SendMessage
注释:搜寻开头含有某个字符串的选项
List1.ListIndex=Index
Else
List1.ListIndex=0
EndIf
EndSub
注释:下面的代码为设置水平滚动条的宽度
PrivateSubCommand2_Click
DimmaxAsLong,fAsFont,iAsInteger

Me.ScaleMode=vbPixels注释:以像素为单位
Setf=Me.Font注释:保留窗体的Font
SetMe.Font=List1.Font
注释:将List1的Font设置给窗体,便可用窗体的TextWidth方法来计算ListBox每一个选项的宽度
WithList1
Fori=0To.ListCount
IfMe.TextWidth)>maxThen
max=Me.TextWidth)
EndIf
Next
EndWith
max=max+10注释:
SetMe.Font=f注释:还原窗体的Font
SendMessageList1.hwnd,LB_SETHORIZONTALEXTENT,max,ByVal0&
EndSub
注释:当我们的鼠标在List中移动时可以检测鼠标所在的位置,其代码如下:
PrivateSubList1_MouseMove
DimlXPointAsLong
DimlYPointAsLong
DimlIndexAsLong
IfButton=0Then注释:如果没有按钮被按下
lXPoint=CLng注释:List的宽度
lYPoint=CLng注释:List的高度
WithList1
注释:获得当前的光标所在的的屏幕位置确定标题位置
lIndex=SendMessage+lXPoint))
注释:显示提示行或清除提示行
IfAndThen
.ToolTipText=.List
Else
.ToolTipText=""
EndIf
EndWith
EndIf
注释:我们也可以设置List的行间高度,代码如下:
PrivateSubCommand1_Click
DimiAsLong
注释:返回listbox高度
i=SendMessage,LB_GETITEMHEIGHT,0,&O0)
注释:在原高度中增加一个值
i=i+3
注释:设置高度
i=SendMessage,LB_SETITEMHEIGHT,0,ByVali)
i=SendMessage,WM_SETREDRAW,True,0&)
EndSub
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值