奇谭怪剑

“奇谭怪剑”————奇谈怪见是也!你想说什么就说什么;你想知道什么就能知道什么;你想要什么就有什么;来吧朋友————天剑这儿应有尽有!..........*^-^*..........

881 成员697 主题2,175 回复0 张照片

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

天
天 剑
2000-05-08 16:51


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


大家知道,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消息发送给文本框,再次运行该程
序,这时我们会发现,文本框的下半部分显示不出来,尽管实际上文本仍然是存储在控
件中的。

VB之:防止用户编辑文本框控件中的内容

Visual Basic中的文本框控件允许用户在其中键入文本,以便在程序中使用。
相反,程序员可能会希望显示一些文本但不希望用户编辑该文本。本文介绍了如何创建
只读的文本框控件的内容。
使一个文本框控件只读
在Visual Basic中,如果文本框控件的MultiLine属性设置为True,文本将会自动
地换行到下一行。另外,如果文本框控件的ScrollBars属性设置为3-Both
(或者1-Vertical,或者2-Horizontal),用户还能够滚动控件中的内容。
程序员要想实现文本框控件中的文本不可编辑,可将文本框控件中的内容设置为只
读状态,这可以通过使用Microsoft Windows 应用程序编程接口(API)的SendMessage
函数来实现。SendMessage函数可以用来发送一个EM_SETREADONLY消息到文本框控件中,
这将使文本框控件变为只读。
要在程序中使用该SendMessage函数,需要将如下的声明语句包含在项目的通用声明
部分中(注意该声明语句需要书写在一行内):
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
该SendMessage 函数需要4个参数,如下所示:
hwnd一个长整数值,它包含文本框控件的句柄。
wMsg一个长整数值,它包含被发送的消息,在这个例子里,是EM_SETREADONLY。
wParam一个整数值,如果它为True,则控件被设置只读标记,如果它为False,
则删除控件的只读标记。
lParam一个长整数值,它应该被设置为0(EM_SETREADONLY不使用它)。
在程序运行了此SendMessage函数之后,将返回一个长整数值,指明调用成功
(返回值非0)或是失败(返回值为0)。
样例程序
该程序显示了如何防止用户编辑一个文本框控件中的内容。
1.在Visual Basic 中开始一个新的工程,采用缺省的方法建立Form1。
2.将如下的常量和声明语句添加到Form1的通用声明部分中(注意该声明语句
需要书写在一行内):
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer,
ByVal lParam As Long) As Long
Const WM_USER = &H400
Const EM_SETREADONLY = (WM_USER + 31)
3.在Form1上添加一个文本框控件,采用缺省的方法建立Text1。将其MultiLine
属性设置为True,并且将它的ScrollBars属性设置为3-Both。
4.在Form1上添加一个命令按钮控件,采用缺省的方法建立Command1。
5.将如下的代码添加到Command1的单击事件中:
Private Sub Command1_Click()
Dim RetVal As Long
RetVal = SendMessage(Text1.hwnd, EM_SETREADONLY, True, ByVal 0&)
End Sub
通过按下F5键来执行样例程序。在文本框控件中键入一些文本,可以使用水平和
垂直滚动条来滚动文本,还可以改变文本的内容。单击命令按钮,用户仍然可以使用
滚动条或是光标键来查看文本框控件的内容,但是不能编辑它。 

巧用Visual Basic的TIMER控件

Visual Basic提供一个Timer控件,其本质上是一个具有间隔时间设置所触发的
时间程序,使我们可以将其隐藏在系统中,以某一时间间隔触发相关程序。灵活地运
用它可以取得很巧妙的效果。
下面,我们举一个例子。
我们可以在界面设计中设计出这样一种效果:一行文字在窗体中自左向右逐渐滚动,
从右边“滚”出窗体的文字,又在左边逐渐出现。如此循环下去。类似电视上的滚动信
息。这样可使你设计的软件显得很生动,极易引起用户的兴趣 。其实,使用Visual
Basic的Timer控件就可很容易地实现它。
首先,我们在窗体中设置两个Label控件Label1、Label2。这两个控件中除Left
属性外,其他属性设置成完全一样。这主要是为了实现循环滚动的效果。它们的Caption
属性设置为要滚动显示的文字。另外再调整好其字体、大小和颜色等。在Form-Load过
程中设置Label2.Left=-6240(窗体宽度),Label1.Left=0。这样可保证Label1
的一部分“滚”出窗体,则Label2的一部分就进入窗体。而形成循环滚动在窗体中设置?/FONT>Timer控件。Timer控件的Interval属性决定滚动的速度,单位是毫秒。例如,
我们设置成300,则每隔0.3秒滚动一次。然后,在Timer1-Timer()过程中加入如下
程序:
Private Sub Timer1-Timer()
Label1.Left=Label1.Left+50
Label2.Left=Label2.Left+50
If Label1.Left>=6240 Then
Label1.Left=-6240
End If
If Label2.Left>=6240 Then
Label2.Left=6240
End If
End Sub
滚动效果就形成了,感兴趣的读者可以试试看。只要灵活运用Timer控件,我们
还可以设计出更有趣的效果。如用Timer控件控制按钮控件的Visible属性,形成闪烁
按钮。用Timer控件控制显示不同的图象,形成简单的动画。

如何使VB的网格控件具有输入功能

我们在使用Visual Basic for Windows开发时,经常用到网格控件(Grid.vbx),
因为此控件可以用来作类似于电子表格形式的输出表,且编程简单,但在此网格控件
只有输出功能,而不能直接在网格上输入,这给使用者带来一些不便。如何在执行时
向网络控件中输入数据,人们使用了一些方法,但大都使用一文本控件作中间转换,
即将欲输入的信息先输入到该文本控件,然后将文本控件的TEXT属性赋给网格的TEXT
属性,这种方法尽管解决了向网格输入数据问题,但增加了一文本框,对界面有些不
美观,修改部分数字不方便,且影响速度,那么,如何直接向网格输入数据呢?
本文将解决直接向网格输入数据问题,基本思想是:使用网格控件KeyPress事件,
从键盘上接收所击键位的KeyAscii值,再由Chr$()或Chr()函数转换成字符,
然后读出网格单元的当前Text值与由键盘接收到的字符相加,组成新的字符串,再赋给
该单元的Text属性,即Grid.Text=Grid.Text+Chr$(KeyAscii)。程序清单如下:
程序中定义了两个Form级变量WgridCol%和WgridRow%。
Sub Grid-KeyPress(KeyAscii as Integer)
Grid.Col=WgridCol%
Grid.Row=WgridRow%
if KeyAscii=8Then `keyascii=8为退格删除键
if Grid.Text<>””Then Grid.text=Mid$(Grid.text,
1,Len(Grid.text)-1)‘删除最后一个字符
Else
Grid.text=Grid.text+Chr$(KeyAscii)
End if
End Sub
Sub Grid-RowColChange()
Wgrid.Col%=Grid.Col
Wgrid.Row%=Grid.Row
End Sub
这样就可以实现对网格的任意输入,可以输入字符、数字等等。由于数字0到9的
Ascii值为48到57,小数点Ascii的值为46,所以可以输入任意实数。若您想防止用户
输入除数字、小数点以外的任何其他字符,可对来自于键盘的Ascii值进行判断,有条
件地接收,就实现了仅输入数值字符。同理也可以限制只输入字母字符。
根据这种思想,也可以对VB中一切不具有输入功能,但具有KeyAscii或者KeyDown
事件的控件进行直接输入,如标签Label等。
1 / 1

登录后回复。