VB 版 (精华区)

发信人: Sun (大灯泡), 信区: VisualBasic
标  题: 功能强大的SendMessage函数 
发信站: 哈工大紫丁香 (Tue Aug 31 12:21:46 1999), 转信

   
  王卫 

Windows API是程序开发人员的火力强大的“武器库”,在这个武器库中,有很多
极具威力的武器,SendMessage就是其中之一,灵活使用这个函数,会给编程工作
带来很多便利,本文以Visual Basic为例,结合几个具体的例子介绍该函数的功能。

多行TextBox中的快速处理功能


在处理多行TextBox时经常会碰到以下情况:

* 希望了解TextBox中目前共有多少行文字;

* 想快速返回第N行的文字。

用SendMessage函数完成上面两个任务非常简单,每个任务只需简单地发送一条消
息给多行TextBox即可,两个消息分别为:EM—GETLINECOUNT 、EM—
GETLINE,下面用一个简单的实例演示这两个功能:



新建工程,在Form1上添加三个TextBox,名称分别为Text1、txtLineCount、
TxtString,将Text1的MultiLine属性置为True,三个标签和一个命令按钮。

为工程添加一个模块Moudle1,在其中写如下声明:

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd 
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const EM—GETLINECOUNT = &HBA

Public Const EM—GETLINE = &HC4

在Form1的代码模块中写如下代码:

Private Sub Command1—Click()

Dim str(256) As Byte

str(1) = 1 ′最大允许存放256个字符

′获取总行数,结果显示在txtLineCount中

txtLineCount = SendMessage(Text1.hwnd, EM—GETLINECOUNT, 0, 0)

′获取第3行的数据放在str中,转换为字符串显示在txtString中

SendMessage Text1.hwnd, EM—GETLINE, 2, str(0)

txtString = StrConv(str, vbUnicode)

End Sub

两点补充说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节
数组,在调用完成后,再将字节数组转换为字符串;另外,调用前必须在lParam的
前两个字节指明允许存放的最大长度,其中第一个字节为低位,第二个字节为高位
,本例将高位(即str(1))置1,说明最大允许存放256个字符。


程序控制拉下或收起组合框的下拉列表


有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),
为了实现这个目的,也只有借助于SendMessage函数,方法是发一个CB—
SHOWDROPDOWN(&H14F)消息给组合框。

在发CB—SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True)还
是收起列表(=False),lParam不用(设为0)。下面提供简单的程序片段:

当程序中某处需要拉下组合框Combo1的列表时,写如下调用语句:

SendMessage Combo1.hwnd, CB—SHOWDROPDOWN, True, 0

当需要收起组合框Combo1的列表时,写如下语句:

SendMessage Combo1.hwnd, CB—SHOWDROPDOWN, False, 0


在列表框中查找匹配的项目


在Win95风格的帮助系统中一般都有一个索引页,索引页含有一个文本框和一个列
表框,当用户在文本框中输入文字时,下拉列表会动态地显示与文本框中文字最匹
配的项目。使用SendMessage函数实现这种特性非常简单,只需在文本框的
Change事件中给列表框发一条LB—FINDSTRING(&H18F)消息,该消息告诉列
表框在列表中查找匹配的项目。

在发LB—FINDSTRING消息时,wParam参数代表从列表框的哪一个项目后面开始
查找,一般情况下该参数可定为-1,表示从List1(0)即第一项开始向后循环查找,
lParam则传进欲搜索的字符串(必须采用值传递)。具体实现见下面例子。


为ListBox添加水平滚动条


在VB中,列表框控件没有设置水平滚动的能力,当某些项目的文本超出列表框宽度
时就无法显示出来,因此,很有必要为ListBox添加一个水平滚动条来方便操作。



为添加水平滚动条,只需发一条LB—SETHORIZONTALEXTENT(&H194)消息
给列表框即可,发送消息时,wParam为滚动条的长度(以像素为单位,可通过计算
得出准确的长度,也可随便给一个大于最大文本宽度的数字,如本例的250),
lParam不用。

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd 
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const LB—FINDSTRING = &H18F

Public Const LB—SETHORIZONTALEXTENT = &H194

Private Sub Form_Load()

List1.AddItem "软件"

List1.AddItem "电脑游戏"

List1.AddItem "电视机"

List1.AddItem "电视台"

List1.AddItem "电脑"

List1.AddItem "电脑游戏软件"

′为列表框添加水平滚动条

SendMessage List1.hwnd, LB—SETHORIZONTALEXTENT, 250, 0

End Sub

Private Sub Text1_Change()

′注意!当lParam传入的是字符串时,必须用ByVal传递

List1.ListIndex = SendMessage(List1.hwnd, LB—FINDSTRING, -1, ByVal 
Text1.Text)

End Sub

本文程序均用Visual Basic 5.0企业版编写,在PWin95环境下运行正常。

 



 
 
     
     
--
〖小糊涂虫2000灌水机〗

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.004毫秒