选择显示字体大小

防止文本控件中的部分滚动


  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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons