VB编程技巧

VB编程技巧几例

1 文本框内容的自动选择。

在软件安装等一些场合需要将文本框中的内容自动选择,比如选择确省安装路径,在VB中可用如下的事件驱动代码:

sub text1_getfocus()

text1.selstart=0 ’选择起始位置

text1.sellength=65000 ’选择长度

end sub

sellength接近文本框允许的最大长度(65535),这样做是为了

强迫VB使用文本的实际长度。

2 防止自身多次运行。

由于WINDOWS的多任务处理功能, 有些程序可能打开后忘记了,下次用时还可能再打开,这样做会占用系统资源降低系统效率。为了防止自身被多次运行,可利用VB应用对象提供的PrevInstance属性来检测内存中是否已有一个自身的副本,若有则给出提示后结束。一般将检测代码放在FORM_LOAD()中,因为程序一运行就要检测。

代码如下:

sub form_load()

if App.PrevInstance then

msg$=App.exename & ”has already run”

msgbox msg$,48 ’给出程序已运行的提示和一惊叹号以示警告

end

endif

end sub

3 格式化输入。

在数据输入过程中,有些数据要求一定的格式,比如限制输入的只能为数字或英文字符,这可用VB的格式输入文本框来实现。它与文本框(TEXT BOX)功能基本相似,但多了一个MASK属性,MASK属性常用的设定如下:

#—限定仅能输入数字0~9;

A— 限定输入为英文字符及数字;

?—限定仅能输入英文字符;

.—限定小数点位置;

:—限定时间分隔号;

/—限定日期分隔号

不需编写代码,只要在设计时将格式化文本框对象(MASKED EDIT)的MASK属性设计好所需格式即可。比如 ## - ## - ## 可输入12-11-96。

4 用MSGBOX函数设计版权信息。

MsgBox函数可用来设计简易的版权信息,它只能显示文本,如果要求不高的话可采用它,优点是非常方便,比如在菜单ABOUT项中显示版权信息。

MsgBox函数的用法如下:MsgBox msg [, [type][, title] ]

msg —需要显示的文字信息,如版权信息。

type—按钮显示选择项。

如 0 只显示 OK按钮(确省选择),4 显示 Yes 和 No 按钮

t

itle—标题文字信息。

MSGBOX最多能显示1024个字符, 超出的将被截去;它可自动换行,如果你想强制换行的话需要在换行处加入换行符CHR(10)。

例子:

Sub Form_Click ()

Msg1 = ” Copyright (c) 1996” & Chr(10) & ”Ver

1.0 ” ’分两行显示

MsgBox Msg1, 0, ”Copyright demo” ’只显示一个OK按钮

End Sub

使用 IIF 和 SWITCH 以精减代码

在很多地方你都可以使用一个更紧凑的 IIf 函数来代替 If...Else...Endif 的结构: 例:返回两个值中较大的一个 maxValue = IIf(first >= second, first, second)

Switch 则是一个很少使用的函数,可是在很多方面它都提供比 If...ElseIf 结构更好的 例:判断 "x" 是正、负还是 null?

Print Switch(x0,"正", True, "Null")

变量的地址

VB5 内置了一个 VarPtr 函数,可是此函数在 VB4 中没有提供。可是你知道吗?VB4 的运行库中已经包含了此函数。只是在用它之前,我们需要声明一下:

#If Win16 Then

Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long

#Else

Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long

#End If

此函数在传递一个 Type 结构(如果此结构要求其一段是另一个变量或记录的地址)给一个外部的 API 程序时十分有用。

向文件中写入非 ASCII 字符

如何向一个文件中写入非ASCII字符(ASCII码在128-255之间)?这在 VB3 中按常规方法就可以很好处理。但是,自 VB4 起,微软引入 Unicode 后,此问题就显得有些麻烦。方法如下:

Dim a As Byte \\'如果你不用 Unicode,微软推荐使用 Byte 类型替换 String 类型

a=&HF5 \\'此处直接给处 ASCII 码即可

Open "test.dat" For Binary As #1

Put #1, , a

Close (1)

VB中感叹号“!”与圆点“.”的用法差异

在Visual Basic中,惊叹号“!”与圆点“.”都用于给对象命名,但两者语法上却存在很大的区别,这点在编程时尤其需要注意。

圆点操作符“.”用来表示对象的属性和方法,在引用时,需要用到对象的Name、圆点和需要的属性或方法。例如要引用文本框Textl中的文本属性时可用reponse$=Text1.Text,再如要改变Form1窗体返回或读取对象高度的单位时用Form1.ScaleHeigh=2000表示。

感叹号“!”常用于当一个控件作为一个特性访问的情况下,例如引用Fomr2中Text1文本框文本属性时,可采用response$=Form2!text1.text语法格式。

虽然两者的语法应用结构有较大差异,但两条语句的性能是相

同的,值得注意的是如果你在感叹号“!”的位置使用“.”可以获得对窗体上Text1特性的直接访问权,为了进一步增加感性认识,你不妨运行下面的例子来试试。

1.建立一个新项目,并在Form1窗体中增加一个命令控件。

2.双击Form1窗体,编辑Form-Load事件并输入:

Form1!Command1.Caption=”Text”

Form1.Command1.Caption=”It Works”

3.运行试项目,这时你就会在Command1命令框中看到字符串It Works。

为了在程序中清楚地界定引用的控件名和该控件的属性或方法,增加程序的可读性,最好使用感叹号“!”,这也是VB的推荐方式。

0、""(空字串)、Null、Empty、与 Nothing 的区别

先回答以下问题吧! 经过以下的叙述之后, 变量 A、B、C、D 分别等于 0、""、Null、 Empty、 Nothing 的哪一个?

Dim A

Dim B As String

Dim C As Integer

Dim D As Object

A 等于 Empty, 因为尚未初始化的「不定型变量」都等于 Empty。但如果检测 A = "" 或 A = 0, 也都可以得到 True 值。

B 等于 "", 因为尚未初始化的非固定长度「字串」都等于 "" 。 但请注意 B Null。

C 等于 0, 这个还有问题吗?

D 等于 Nothing, 尚未设定有物件的「物件变量」都等于 Nothing, 但请不要使用 D = Nothing , 而要使用 D Is Nothing 来判断 D 是否等于 Nothing, 因为判断 是否相等的符号是 Is 不是 = 。

最令人迷惑的地方是 Null 这个保留字, 请看以下语句:

Print X = Null

Print X Null

结果都是输出 Null(不是 True 也不是 False), 这是因为任何一个运算式只要含有 Null , 则该运算式就等于 Null, 实际上想要判断某一数据是否为 Null 绝对不能使用:

If X = Null Then \\' 永远都会得到 Null

而要使用:

If IsNull(X) Then

哪一种数据会等于 Null 呢? 除了含有 Null 运算式之外, 就属没有输入任何数据的「数据字段」(在数据库中) 会等于 Null。

巧用Visual Basic的RND()函数

Visual Basic的RND()函数有一个重要的特征:当RND()的参数(我们称这里可以称它为种子)为负值时,同一种子(负值)产生同一个随机数序列。同时Visual Basic还具有强大的二进制技术功能,这样我们可以按以下思路实现文件内容加密:

X=RND(-KEY) ’KEY为正数

VAULE=INT(256*RND) ’产生一个随机数(以此为密码)

Open FILENAME$ For Binary As #FILENUM’打开文件

Get #FILENUM,I,A ’取文件内容

B=A XOR VAULE ’得到加密文件

结合

C=B XOR VAULE’得到解密文件(B为

加密后文件内容)

注意:这里的A非整个文件内容,可以是极少部分、几个字节甚至单个字节,若为单字节,则文件中的每个字节同不同的数异或,破译难度可见有多么大。具体过程:

Sub ENDECODE(FILENAME$,MA,FILE2$)\\'参数为:源文件,密码,目标文件

Dim FILENUM As Integer,X As Single,I As Single

Dim CHARNUM As Integer,RANDOMINTEGER As Integer

Dim SINGLECHAR As String *1,filen2 As Integer\\'取单字节

If MA

MA=MA*(-1)

End If

X=Rnd(-MA)\\'参数为负

FILENUM=FreeFile

Open FILENAME$ For Binary As #FILENUM \\'二进制方式打开源文件

filen2=FreeFile

Open FILE2$ For Output As #filen2’以顺序文件打开目标文件

For i=1 To LOF(FILENUM)\\'LOF()文件字节长

Get #FILENUM,i,SINGLECHAR\\'取单字节内容

CHARNUM=Asc(SINGLECHAR)

RANDOMINTEGER=Int(256*Rnd)\\'得到字母表

CHARNUM=CHARNUM Xor RANDOMINTEGER\\'异或

Print #filen2,Chr$(CHARNUM);’写入目标文件

Next I

Close FILENUM

Close filen2

ok ’调用成功对话框

End Sub

调用格式:ENDECODE 源文件名,密码,目标文件名

上面过程可以对任何EXE、COM、文本等文件进行加解密(奇数次加密,偶数次解密),重演性极好,保密性特优,若对上述过程进一步加工,如进行多重随机等手段处理,那么将会更上一层楼,在此不累述。

顺便提一下,上面过程若对目标文件同样以二进制文件打开、写入,那么只能对纯西文文本进行加解密,对于纯中文文本则通过修改取双字节、I的步长为2来实现,其它(中西文结合文本、EXE、COM等文件)则将得不到预期结果,其原因可以能是ASCII大于127的字符,不能正常显示,不能用put语句正常写入文件(得到的只是空格),有兴趣者不妨一试。

利用 lstrlen 计算中英文混合字串的长度

在 32-bit 版本的 VB 底下, 将每一个字符都视为两个 Byte, 所以

Len("中英Mixed") 等于 7

LenB("中英Mixed") 等于 14

但是在很多场合底下, 我们希望中文字长度以 2 计算, 英文字母长度以 1 计算, 此时使用的方法如下:

\\' 欲计算字串 S 的长度

N = 0

For I = 1 To Len(S)

C = Asc(Mid(S, I, 1)) \\' 取得第 I 个字符组的字符码

If C >= 0 And C

N = N + 1

Else \\' 中文

N = N + 2

End If

Next

看起来程序有点罗唆, 如果您不喜欢这个方法, 可以使用 Windows API 的 lstrlen 函数, 假设假计算 S 的长度, 则 API 声明式如下:

Private Declare F

unction lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long

而调用的叙述则是:

n = lstrlen("中英Mixed" + Chr(0))

Print n \\' n 将等于 9

请注意调用 lstrlen 时必须加上 Chr(0), 因为此一函数是根据 Chr(0) 来判断字串的结束。

调用 lstrlen 除了程序比较简短之外, 速度也比我们写 VB 程序判断中英文字然后计算长度来的快。

利用 StrConv 计算中英文混合字串的长度

上一周说明利用 Windows API 的 lstrlen 计算中英文混合字串的长度之后,台中的 Rose 读者来函, 说还有更简单的计算方法, 如下:

LenB(StrConv("中英Mixed", vbFromUnicode))

说真的, 因为笔者懂得调用 Windows API, 所以竟然忽略了此一 VB 内建的函数,可见闻道有先后, 在此笔者亦希望先闻道的读者能够将您的心得发表出来, 与喜欢 VB 的读者交流。

StrConv 的作用是字串内容的转换, 其中将叁数二设定成 vbFromUnicode,作用是把「双位元」的字串转换成中文字占用 2 Bytes、英文占用 1 Bytes 的字串,所以紧接着调用 LenB, 便可以计算出中英文混合字串的长度。

如何传递不固定个数的叁数?

定义副程序时, 我们必须把叁数一一列出来, 例如:

Sub MySub( P1, P2, ┅)

但如果我们将来调用副程序时, 可能会传入不固定个数的叁数, 那么副程序该如何定义呢?答案如下:

Sub MySub( ParamArray P() ) \\' 把叁数 P 定义成一个阵列

如此定义副程序之后, 以下都是将来可能出现的调用叙述:

MySub "ABC" \\' 只传递一个叁数

MySub 1, 3, 9, 988, 776, 234 \\' 传递 6 个整数叁数

MySub 123, "abc", Date() \\' 传递 3 个不同型别的叁数

以最后一个调用叙述为例, P(0) 叁数将等于 123, P(1) 叁数等于 "abc", P(2) 叁数则等于 Date() 函数的传回值, 而由于 P() 是一个阵列, 我们可以利用以下方法读取每一个叁数:

For i = 0 To UBound(P)

\\' P(i) 等于第 i 个叁数

Next

最后, 请注意以 ParamArray 所定义的叁数一定是 Variant(不定型) 型别, 若要判断每一个个别叁数的资料型别, 可以使用 TypeName 函数。

文 章 点 评 0 篇

>>上篇文章:VB编程技巧几例

>>下篇文章:用VB实现全屏幕图形界面及动态功能提示

『关闭窗口』

文章浏览时的广告

文章浏览广告

用VB实现全屏幕图形界面及动态功能提示

现在加入 http://14.66.102.214

在许多Windows软件的安装程序中,时常可以看到以某种颜色由浅至深的渐变为背景的窗口。使用VB制作这类窗口的方法有不少,而通过调用API函数绘制渐变的窗口背景色,似乎是一种既简单又节省资源的方法。

首先,在module文件中加入下列声明语句:

Declare Function CreateSolidBrush Lib"GDI"(ByVal crColor As Long) As Integer

Declare Function FillRect Lib"USER"(ByVal hDC As Integer,lpRect As RECT,ByVal hBrush As Integer)As Integer

Declare Function DeleteObject Lib"GDI"(ByVal hObject As Integer)As Integer

Type RECT

left As Integer

top As Integer

right As Integer

bottom As Integer

EndType

然后,在窗口的Paint事件中加入下列代码:

Private Sub Form_Paint()

Dim Color As Integer

Dim hBrush As Integer

Dim OldMode As Integer

Dim RetVal As Integer

Dim StepSize As Integer

Dim X As Integer

Dim FillArea As RECT

OldMode%=Me.ScaleMode

Me.ScaleMode=3

StepSize%=1+Me.ScaleHeight/80

Color%=255

FillArea.left=0

FillArea.right=Me.ScaleWidth

FillArea.top=0

FillArea.bottom=StepSize%

For X%=1 To 80

hBrush%=CreateSolidBrush (RGB(0,0,Color%))

RetVal%=FillRect(Me.hDC,FillArea,hBrush%)

RetVal%=DeleteObject(hBrush%)

Color%=Color%-4

If Color%

FillArea.top=FillArea.bottom

FillArea.bottom=FillArea.bottom+StepSize%

Next

Me.ScaleMode=OldMode%

EndSub

按F5运行,就会出现一个以从上至下、由浅至深的渐变蓝色为背景的窗口。对上述代码稍加改动,便可制作出各种颜色和水平方向的渐变背景。

如何在VB和Delphi中快速实现立体化窗口显示

在VB和Delphi中,我们可以很方便地创建具有立体化观感的窗口,这也是近两年来,Win3.X中较为流行的显示方式。许多专业化的软件都采用了这种立体化的窗口和相应的控件,达到了赏心悦目的效果。下面我们来谈谈如何在目前最流行的两种Win编程语言中实现这样的效果。

其实,无论是VB还是Delphi,要实现这种效果都较为容易,在编程中,并不需要调用外部的DLL,在程序运行时,会自动调用CTL3dV2.dll。

我们先来看看如何在VB中实现:

1.新建一个窗口。

2.在窗口form的属性列表中有一项Auto3D属性,缺省值为false,将其设置为true。它是控制VB中是否显示立体窗口的重要属性。

3.在form的属性列表中还有一项BorderStyle属性,这是控制窗口的边框显示类型,将其设置为3-Fixed Double。

4.现在可以运行这个程序了,你将会看到立体窗口出现。

将Auto3D属性设置为true,还有一个很好的副作用,那就是在这个窗口上的Text、Frame、CheckBox、OptionButton和ListBox

都自动具有了立体效果。

在Delphi中实现似乎显得更加容易和直观:

1.新建一个窗口。

2.在窗口form的属性列表中有一项BorderStyle属性,它的缺省值为bsSizeable,表示边界可以任意调整,将其重新设置为bsDialog。

3.运行程序,你会发现立体窗口出现了。(看来,Delphi中将这种立体化窗口称为“对话窗口”,确实如此,比如在Word中,对话窗口都是这种立体化的显示,而主窗口仍然是一般的风格。)

与VB中的Auto3D类似,在Delphi中有一个属性为Ctl3D,将其设置为true,将使所有在这个窗口上的控件具有立体观感,并且这种变化是立刻反映的,而不象VB中在运行时才能看到。

在Delphi的窗口form中,你还可以通过设置FormStyle属性为fsStayOntop来轻而易举的实现“永远浮在其他窗口”上的效果。著名的“译林”Win版本就是用Delphi写的,它其中就有一个“永远在最上面”的功能,就是这样实现的。

用Visual Basic设计更好的用户界面

有时在一个窗口中出现较多的控制件时,如果能向导式地建议用户下一步该做什么,不失为上策。

在Visual Basic的程序设计中,我们可以使用语句:Object.SetFaocus使我们希望的控件得到输入焦点,举个例子:在Form1中我们加入一个按钮Command1和一个文本输入Text1,双击按钮控件,然后键入如下代码:

Text1.SetFocus

再按F5运行程序,您就会看到一单击按钮,文本框会立即取得输入焦点。另外,我们还可以使用语句:Sendkeys ""使下一个控件获得焦点,但我们需要在设计时确定各控件的Index值。(在Properties窗口中)让控件自己感知自己的工作已完成,而主动将焦点让出,会使用户觉得应用程序很聪明,也减少了用户出错的机会。

可是当焦点切换的两个控件相隔有一定距离时,上述的方法有时也不足以引起用户的注意,那么一种好的解决方法是将鼠标箭头也移到控件上。可惜,VB并不支持鼠标移动,那我们就求助API函数,API函数SetCursorPos可让我们如愿。

下面是子程序MoveCursorOn,它可让鼠标移动到指定控件上方。

下列代码请放在declarations段中:

Type PoinTAPI

x As Integer

y As Integer

End Type

Declare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)

Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)

Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer

然后建立一个新的子程序(ALT+N→N→键入子程序名MoveCursorOn),下面是子程序的代码:

Sub MoveCursorOn(source As Control)

Dim Pt As PoinTAPI

Dim hparent As Integ

er

p.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)

p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)

hparent=GetParent(source.hwnd)

ClientToScreen hparent pt

SetCursorPos pt.x pt.y

End Sub

使用该子程序很容易,例如我们想把鼠标移动到按钮Command1上,就可使用语句

Move Cursor On Command1

您会看到鼠标箭头已经指着按钮Command1。

需要说明的是,千万不要滥用该子程序。让鼠标自己满屏乱飞,我们的用户会感到失去对应用程序的控制,这是违反我们的初衷的。

在有数个输入框的窗口中(这在数据库应用程序中是很典型的),当用户完成第一个输入框的输入后,总爱习惯性的加一个回车,希望输入焦点落到下一个输入框中(DOS中大多数应用程序是如此),可往往事与愿违,这一回车却触发了拥有Default特性的按钮,结果不是关闭了当前窗口就是又蹦出另一窗口。用户睁大眼睛看着屏幕,“咦?!我到底做了什么?”这是Windows新用户经常遇到的事情。

解决它其实很容易,只需在输入框的KeyPress事件中加入如下代码:

IF KeyASCII=13 Then

KeyASCII=0

Sendkeys ""

END IF

这样,当用户在这个输入框中键入Enter时,就象键入TAB键时,焦点被移到下一控件上。但需注意,这种方法不适用于多行的TextBox,即TextBox的MultiLine特性设为True时,因为这时的回车键是起换行的作用。

利用VB三维面板控件设计流动条

VB提供了一个三维面板控件,利用这个控件可设计图形效果的立体界面,从而使应用程序的截面显得更生动、美观,该控件还可以设置各种形式的背景,然后在背景上显示各种形式的字符,令人感兴趣的是,使用三维面板控件,还可设计我们经常在安装程序中看到的表示安装进度的流动条,并可显示进程的流动条,并可显示进程百分比,改变流动条的颜色等。

一. 介绍属性

FloodColor: 确定流动条的颜色,缺省为蓝色。

FloodPercent: 显示当前过程如流动条进行的百分比,参数改变时显示的百分数和流动条的面积改变,设为一整型值,取值范围是0~100。

FloodShowpct: 决定是否在三维面板控件上显示百分比,是一个逻辑值。为Ture时显示,为False时不显示。

FloodType: 表示用户对三维面板控件的使用方式。可取值有6个,如下所示:

0 缺省设置

1 表示流动条方向从左到右

2 表示流动条方向从右到左

3 表示流动条方向从上到下

4 表示流动条方向从下到上

5 表示使用指定的颜色从圆心向外画圆

二. 流动条设计

如果在Windows 3.x下

,工具箱中不存在三维面板控件,可选择File菜单中的"Add File…" 进行添加,在弹出的对话框中找到WindowsSystem目录,然后选定Threed.vbx文件即可,如果使用VB 4.0,需在Tools菜单中选择Custom Control命令,选定Sheridan 3d Controls项,按OK按纽,可在工具箱中增加三维面板控件。

启动VB ,在窗体中画一水平方向的长方形三维面板控件,按F4,在属性窗口中设置其Name为P3d、Bevellnner为2-Raised、FloodType为1、FloodshowPct为True,再在窗体中画一个按纽Command1,双击该按纽,键入下面的代码:

Sub Command1_Click()

P3d.floodpercent=0

For N%=1 To 100

If N%>100 Then

Exit sub

End If

P3d.FloodPercent=N%

Next N%

End Sub

按F5,运行该程序,点击Command按纽,即可看到流动条效果。

利用VB的图片框实现屏幕的滚动

对于学习使用VB来编程的电脑爱好者来说,可能会遇到这样一个问题:就是如何实现屏幕的滚动,因为当要显示的内容超出了屏幕的大小后,利用VB所提供的垂直滚动条和水平滚动条等控件是不可能直接实现这一特殊显示功能的。那么有没有其它的办法呢?答案是肯定的。我们知道VB的图片框是用来显示图形的,但它还有许多其它用途,比如可以用来创建一些动画图形等。其实对于上面的问题我们也可以利用图片框来巧妙地解决。方法如下:

首先,单击工具框中的图片框(Picture Box)控件和命令按钮控件,在窗体(Form1)上建立图片框对象Picture1和命令按钮对象Command1,将命令按钮的Caption属性设置为"退出",Picture1的大小设置为显示区域的大小,再单击工具框中的图片框控件,在Picture1上建立另一个图片框对象Picture2,将它的Left和Top属性设置为0。用文本框,标签框等其它控件或导入一幅图象在Picture2上设定具体的显示内容,当然Picture2的大小一定要先调整到能全部容纳所有要显示的内容,最后单击工具框中的垂直滚动条控件和水平滚动条控件,在窗体(Form1)上分别建立垂直滚动条对象VScroll1和水平滚动条对象HScroll1,并设置好它们的属性。至此在窗体(Form1)上的所有设置工作就完成了,下面是具体的程序代码:

Private Sub VScroll1_Change()

Picture2.Top= -VScroll1.Value

End Sub

Private Sub Hscroll1_Change()

Picture2.Left= -HScroll1.Value

End Sub

Private Sub Command1_Click()

End

End Sub

运行程序,当按下横、竖滚动条时,就能使显示内容实现左右、上下的滚动。此方法简单易行,有兴趣的朋友不妨试一试。

VB编程几例:

Visual Basic确实是一种很不错的应用程序开发工具。笔者在使用

中,也确实感到用VB设计程序,许多方法的实现是那么的简单。有时,仅仅需要几条语句,就可实现一种方法、效果或功能。下面就介绍一下,阴影字体在VB中的实现。程序如下:

Private Sub Form-Click()

CurrentX=700

CurrentY=1000

FontSize=30

ForeColor=QBColor(8)

Print”Software Weekly”

CurrentX=750

CurrentY=1050

FontSize=30

ForeColor=QBColor(12)

Print”Software Weekly”

End Sub

在属性(properties)窗口中设置:Auto3D为true Font选一种True Type字体。

该程序是把代码加到Form的Click事件中,通过先打印字体的阴影部分,再打印出字体,以实现阴影字体效果的。试运行该程序,单击窗体后,即呈现出阴影字体Software Weekly。

在VB中制作单独程序封面的两种方法

辽宁铁岭 金永涛

这里所谓的单独封面,是只独立应用程序窗口本身的一个窗口,这个窗口在程序运行时首先弹出屏幕,用于装饰程序本身,或简单的演示一下程序的优越性。这样的封面在很多专业的WINDOWS程序中均存在,在VB中可有两种简单的方法实现这一功能。

第一种方法:多窗体编程方法

此方法是通常采用的方法,即在程序中创建两个或两个以上的Form窗体,把其中的一个作为专门的程序封面制作场所,具体方法:

1、创建一个新项目Form1,并在此窗体内安放Command1命令按钮,在Command1-Click()事件中输入结束程序代码“END”。

2、单击菜单的“Insert"项目,加入一个新窗体Form1。

3、双击Form1窗体空白处,在Form1-Load()事件中输入如下代码,用于隐藏主窗体Form1,置第二窗体为最大模式,并在运行程序首先显示和二窗体:

Private Sub Form-Load () ’隐藏主窗口

Form1.Visible = 0 ’窗口2最大模式

Form2.WindowState =2 ’显示窗口2

Form2.Show

End Sub

4、 在窗体Form2中定义全程变量:

Dim strr1 As String

Dim i As Integer

5、在窗体Form2中放入一个时间控件Timer1。

6、在窗体Form2中的Form-Load ()事件中输入以下代码,用于在窗体2中显示图像,并置时间控件频率:

Private Sub Form-Load ()

Form2.Picture = LoadPicture("c:windowssetup.bmp")

Timer1.Interval = 10

i =0

End Sub

7、在时间控件Timer1- Timer1()事件中进行程序封面的制作工作,演示简单的动画,并控制此动画运行一段时间后自动停止,关闭程序封面,返回程序主窗口;下面的代码实现在一个图片上随机显示字符串,显示30次字符串后自动退出。

Private Sub Timer1-Timer ()

Strr1 = "程序封面演示“

With Form2

.Fo

nt.Transparent =True ’透明显示字符

.Font.Size = Rnd *30+10 ’随机变化字号

.Font.Italic =True ’斜体有效

.ForeColor=RGB(Rnd*256,Rnd*256,Rnd*256) ’随机变化前景

.FontName =Screen.Fonts (Rnd*7+14) ’随机变化字体

End With

hh=Form2.TextHehght (strr1) ’取字符串高度

ww= Form2.TextWidth (strr1) ’取字符串宽度

x=Rnd * ( Form2.ScaleWidth-ww) ’随机改变坐标

y=Rnd *( Form2.ScaleHeight-hh)

Form2.Current X=x

Form2.Current Y=y

Form2.Print strr1 ’显示字符

i = i +1 ’计数

If i >30 Then

Unload Me ’关闭封面

Form1.Show ’调入主窗口

Timer1.Enabled =False ’关闭时间控件

End If

End Sub

8、为了能够人为地控制程序封面的停留时间,可在窗体Form2鼠标单击事件中安放退出封面代码:

Private Sub Form-Click ()

Unload Me

Form1.Show

Timer1.Enabled =False ’关闭时间控件

End If

End Sub

至此工作全部完成,当运行程序时,首先弹出程序封面,封面上显示一幅·BMP图像,之后在此图像上进行随机字符串的显示,字符串的位置、字体、字号、前景色等值都是随机变化的,显示30次后自动关闭封面返回主窗口,演示过程中用鼠标单击窗口也会返回主窗口,在主窗口中按下结束按钮退出程序。具体操作时还有很多其它技巧,比如可以置第二个窗体为主窗体,这样运行时可自动先弹出程序封面,可省略隐藏窗体和调入窗体的过程,另外第二窗体也可以在程序运行时由代码动态生成,这样编程时复杂一些,但有利于程序代码的管理;程序封面的具体制作过程,有许多动态图像控制方法可以使用,只要灵活动用VB的作图方法,再加上一些必要的API函数的配合,会制作出理想的程序封面。

第二种方法:隐藏控件方法

多窗口编程存在着一定的复杂性,需要对多个窗体的·Frm文件进行管理,编码时还需要频繁地在多个窗口间进行转换。实际上通过一个窗体也可以编制出类似的封面效果。基本原理就是在程序运行时首先通过VISIBLE属性隐藏全部控件,然后在主窗体内进行程序封面设计和演示,延时一定时间再恢复所有控件的显示,即达到了独立程序封面的制作过程。由于窗体内的控件很多,逐一隐藏或显示非常繁琐,可采用容器控件简化操作过程,即把控件全部放到Frame1等控件上,这样只要执行Frame1.Visible=0,即可使其上面的所有控件隐藏起来。

c由于程序只涉及一个窗体,程序设计的大部分工作只是编码过程,所以不再分步介绍。在窗体Form1中安放一个时间控件Timer1 和一个容器控件Frame1,再在Frame1上安放一个命令按钮Command1

,具体程序设计时可把所有主程序工作控件放在Frame1上;之后把下面的代码填入相应的事件之中即可完成全部程序设计工作。运行此程序后首先在全屏幕窗体内显示图像,并从左上角开始逐渐放大字符串“程序封面演示”,放大过程中颜色发生平滑变化,形成美丽的拖尾效果,连续显示5次后自动关闭封面,返回主程序窗口,同样立即关闭程序封面,返回主程序窗口,单击主窗体中的命令按钮退出程序。

’定义全程变量

Dim i ,j As Integer

’退出程序按钮

Private Sub Command1-Click ()

End

End Sub

’单击窗体关闭封面

Private Sub Form-Click ()

Frame1.Visible =1 ’恢复容器控件

timer1.Enabled =False ’关闭时间控件

Form1.WindowState =0 ’恢复缺省窗口模式

End Sub

’准备工作

Private Sub Form -Load ()

Form1.WindowState =2 ’窗口最大化

Frame1.Width =Form1.Width ’调整容器控件尺寸

Frame1.Height =Form1.Height

Frame1.Top =0 ’调整容器控件位置

Frame1.Left =0

Frame1.Visible =0 ’隐藏容器控件

timer1.Interval =10 ’置时间频率

Form1.Picture =LoadPicture ("c:windowssetup.bmp") ’装入图像

Form1.ScaleMode=3 ’置坐标刻度

Form1.FontName =“黑体” ’置字体名称

End Sub

’封面制作 (动画演示)

Private Sub timer1-Timer ()

Strr ="程序封面演示"

With Form1 ’透明显示

.Font.Transparent =True

.Font.Size = i + 1 ’放大字号

.Font.Italic =True ’斜体有效

.ForeColor=RGB(i*3,56,256-i*3) ’平滑变化颜色

End With

string =strr

Form1.Current X=i ’连续改变坐标

Form1.Current Y=i

Form1.Print stringg ’显示字符串

i = i +1

If i >72 Then ’放大到72号字

j =j +1 ’循环计数

i =0

Form1.Current X=72

Form1.Current Y=72

Form1.ForeColor =RGB(255,56,0) ’重新显示一次字符

Form1.Print stringg

End If

If j =5 Then ’动画计数

Frame1.Visible =1 ’显示容器控件

timer1.Enabled =False ’关闭时间控件

Form1.WindowState=0 ’恢复窗口模式

End If

End Sub

以上方法及程序在WINDOWS 95系统下,在VB4.0环境下调试通过

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180621B00AEO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券