windows api的sendmessage函数可以用来向visualbasic控件中发送消息,例如向文本框控件上发送消息。本文介绍如何利用该函数防止文本框控件中的部分文本滚动,即该控件中不能滚动的部分不能被用户看见。
发送消息到文本框控件
visual basic中的文本框控件就是一个最小化的字处理程序。当该文本控件的multiline属性被设置为true的时候,则文本可以自动换行;当在文本框控件中键入了许多文本时,控件中的文本会向上滚动。这时文本就变得看不到了,但这些文本实际上仍然在控件中——它们并没有被删除。
windows api的sendmessage函数可以用来防止文本框控件中的文本滚动因而超出我们的视线。当创建该文本框控件时,它的客户区域格式化为一个矩形(该区域就是键入文本的地方),可以给该控件发送em_setrectnp消息,对该矩形区域进行限制,以在文本框的客户区域中指定一个特定区域。
在下面的样例程序中,我们希望文本控件的后一半原封不动地保持完整,即不希望文本滚动而超出视线。可以从文本框控件的height属性中提取出它的高度,并将该值除以2,得到该文本框控件后一半的坐标。然后将该结果传递给sendmessage函数,告诉em_setrectnp防止该矩形区域滚动。
有些程序员可能会希望使用em_setrect消息代替em_setrectnp消息。但是,使用em_setrect消息会停止windows对该格式化矩形区域中的文本的重新绘制,导致文本框控件中的文本会看不到。
样例程序
该程序显示了如何临时冻结一个文本框控件中的特定部分,该部分包含的文本不能滚动,因而不会超出视线之外。
1.在visualbasic中开始一个新的工程,采用缺省的方法建立form1。
2.将如下常量和声明语句添加到form1的通用声明部分中(注意该声明语句需要书写在一行内):
private declare function sendmessage lib "user"
(byval hwnd as integer, byval wmsg as integer,
byval wparam as integer, lparam as any) as long
const wm_user = &h400
const em_setrectnp = wm_user + 4
const em_setrect = wm_user + 3
对于32位环境下使用visual basic5.0的用户,需要将如下声明语句添加到form1的通用声明部分中:
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
const em_setrectnp = &hb4
const em_setrect = &hb3
3.将如下代码添加到form1的form_load事件中:
private sub form_load()
text1.text = " 这 是 我 们 希 望 显 示 出 来 的 第 一 段"
text1.text = text1.text & " 它 位 于 文 本 框 控 件 中"
text1.text = text1.text & chr$(13) & chr$(10) & " 这 是 第 二 段, 我 们"
text1.text = text1.text & " 希 望 将 之 冻 结 以 使 文 本 不 能 滚 动 "
end sub
4. 将如下代码添加到form1的click事件中:
private sub form_click()
dim r as rect
dim x as long
scalemode = 3
r.left = 0
r.top = 0
r.right = text1.width
r.bottom = text1.height / 2
x = sendmessage(text1.hwnd, em_setrectnp, 0, r)
end sub
5.创建一个新的模块。采用缺省的方法建立module1.bas。
6.将如下type结构添加到module1.bas中:
type rect
left as integer
top as integer
right as integer
bottom as integer
end type
对于32位环境下使用visual basic 5.0的用户,需要将如下type结构添加到module1.bas中:
type rect
left as long
top as long
right as long
bottom as long
end type
7.在form1上添加一个文本框控件,采用缺省的方法建立text1,将其multiline属性设置为true。
按下f5来执行该程序,我们可以看到文本框显示在form1上。在窗体上单击一次鼠标,将新的文本键入到该文本框控件中。这时我们可以注意到,当我们在文本框控件的开头处键入新的文本时,在文本框控件下半部分的文本不会滚动。
如果我们将em_setrect消息替代em_setrectnp消息发送给文本框,再次运行该程序,这时我们会发现,文本框的下半部分显示不出来,尽管实际上文本仍然是存储在控件中的。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器