加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

消息传递在VB中的应用

发布时间:2020-12-16 22:52:34 所属栏目:大数据 来源:网络整理
导读:有些窗体在设计时会定义一些特殊的功能消息,而当我们传递这些消息给这类窗体时,这类窗口就会执行某段程序,并返回执行的结果。为了让程序可以送出消息,提供了SendMessageAPI函数。 DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"AsLong hWnd:
有些窗体在设计时会定义一些特殊的功能消息,而当我们传递这些消息给这类窗体时,这类窗口就会执行某段程序,并返回执行的结果。为了让程序可以送出消息,提供了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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读