用VB做下面的这个图,js点击按钮弹出输入框输入/查看读者信息就会出现第二个图的登陆界面,代码怎么写?急 谢谢你们了

当前位置: >>
浅谈VB6.0中的实用技巧
浅谈 VB6.0 中的实用技巧VB6.0 中文本框处理技巧 在 Visual Basic 中,文本框(TextBox)是最常用的控件,熟练运用文本框 是开发出高质量的应用程序的基础。笔者在从事应用程序开发中,摸索出有关文 本框的应用技巧,写出来与 VB 爱好者共享。 1、设置只读文本框。 有些时候在窗口显示一段信息,但又不希望用户去改变它,怎样实现文本的 只读呢?首先
,我们可以利用标签框( label )的只读属性,以标签来代替文本 框以实现只读属性,但也可以用小程序实现真正的文本框的只读。 Sub Text1_KeyPress (keyascii As Integer) keyascii = 0 End Sub 或者也可以用 sendkey 方法使文本框失去焦点,如以下程序: Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) SendKeys &{tab}& End Sub 2、限定文本框的输入内容和格式。 以下程序可以实现限定文本框只能输入数字: Sub Text1_KeyPress (keyascii As Integer) If keyascii &48 Or keyascii& 57 Then Beep Beep
keyascii = 0 End If End Sub 若想限定文本框输入格式,可以使用 VB 的 FORMAT 函数,也可以使用专业版的 屏蔽控件(Masked Edit),通过设定屏蔽控件的 Mask 属性可以对文本框的输入格式 作精确控制。 3、为 TextBox 创建快捷键。 VB 规定,添加在窗体上的控件均在其 Tabindex 属性中记载其加载顺序,程序 运行时焦点按 Tabindex 属性规定的顺序在控件间跳转。而为了简化操作,可 VB 中 为任何具有 caption 的属性的控制创建快捷键,这通过 caption 属性中在想作为 快捷键的字母前加&号实现。但有一个问题值得注意,而类似文本框这样的控件无 caption 这样的属性,这时可将标签与文本框同时使用。为 lable 创建快捷键, 标签 Tabindex 属性设置比文本框小 1,又因为 label 不能接收按点,焦点会自动 跳至文本框。这相当于为文本框创建了快捷键。具体步骤如下: (1) 首先绘制标签,再绘制文本框。或随意绘制各种控制,将标签 Tabindex 属性设置比文本框小 1 (2) 在标签的 caption 属性中使用“&”号设定快捷键 这样就相当于为文本框设定了快捷键,当你按下标签框的快捷键时,焦点就会跳 至文本框上。 4、在设计时实现文本框换行。 对于文本框,在设计时 properties 窗口不能输入换行符,但可以再程序执行时 用代码来换行,即使用 ASCII 字符的 13 和 10,如下列小程序就可将两行文本放入文本框: Sub form_load( ) NL=chr(13)+chr(10) text1.text=“my name is ”& NL & “ liu qiang” End sub 5、创建口令文本框。 创建口令文本框可用设置属性的方法,也可以通过调用 WINDOWS 的 API 应用函数接口 来实现 。首先,文本 框的属性 Passwordchar 和 maxlength 可用来 设置口令 框。其中 Passwordchar 指定文本框显示的字符,如指定“*” ,则在文本框内显示“*” , Maxlength 确定文本框中能输入几个字符。超过 Maxlength 以后,文本框发出警告声, 不能接收更多的字符。若使用 WINDOWS 应用函数接口,可用 GetWindowLong、 SetWindowsLong 和 SendMessage 等接口函数来实现,有兴趣的读者可查阅 Windows API 函数手册或 VB 的联机帮助文件就可以了。 改变 ListIndex 而不发生 Click 事件 在修改 Combo 或 Listview 的 ListIndex 时, 会发生 Click 事件, 下面的函数可以阻止该事件。 声明: 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 CB_GETCURSEL = &H147 Const CB_SETCURSEL = &H14E Const LB_SETCURSEL = &H186 Const LB_GETCURSEL = &H188 函数: Public Function SetListIndex(lst As Control, _ ByVal NewIndex As Long) As Long If TypeOf lst Is ListBox Then Call SendMessage(lst.hWnd, _ LB_SETCURSEL, NewIndex, 0&) SetListIndex = SendMessage(lst.hWnd, _ LB_GETCURSEL, NewIndex, 0&) ElseIf TypeOf lst Is ComboBox Then Call SendMessage(lst.hWnd, _ CB_SETCURSEL, NewIndex, 0&) SetListIndex = SendMessage(lst.hWnd, _ CB_GETCURSEL, NewIndex, 0&) End If End Function 调整 Combo 下拉部分的宽度 声明: Private Declare Function SendMessage Lib _ &USER32& Alias &SendMessageA& _ (ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Const CB_GETDROPPEDWIDTH = &H15F Private Const CB_SETDROPPEDWIDTH = &H160 Private Const CB_ERR = -1 函数: ' 取得 Combo 下拉的宽度 ' 可以利用该函数比例放大或缩小宽度 Public Function GetDropdownWidth(cboHwnd As Long) As Long Dim lRetVal As Long lRetVal = SendMessage(cboHwnd, CB_GETDROPPEDWIDTH, 0, 0) If lRetVal && CB_ERR Then GetDropdownWidth = lRetVal '单位为 pixels Else GetDropdownWidth = 0 End If End Function '设置 Combo 下拉的宽度 '单位为 pixels Public Function SetDropdownWidth(cboHwnd As _ Long, NewWidthPixel As Long) As Boolean Dim lRetVal As Long lRetVal = SendMessage(cboHwnd, _ CB_SETDROPPEDWIDTH, NewWidthPixel, 0) If lRetVal && CB_ERR Then SetDropdownWidth = True Else SetDropdownWidth = False End If End Function Combo 的自动查询技术 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 CB_FINDSTRING = &H14C Private Sub Combo1_Change() Dim iStart As Integer Dim sString As String Static iLeftOff As Integer iStart = 1 iStart = Combo1.SelStart If iLeftOff && 0 Then Combo1.SelStart = iLeftOff iStart = iLeftOff End If sString = CStr(Left(Combo1.Text, iStart)) Combo1.ListIndex = SendMessage(Combo1.hwnd, _ B_FINDSTRING, -1, ByVal CStr(Left( _ ombo1.Text, iStart))) If Combo1.ListIndex = -1 Then iLeftOff = Len(sString) combo1.Text = sString End If Combo1.SelStart = iStart iLeftOff = 0 End Sub 静态变量 iLeftOff 指定了字符长度。 自动选择 Text 的内容 在使用 VFP 的应用进行录入时,每进入一个录入框,就自动选择 该框中的所有内容。利用以下的代码,也可实现类似的功能。 Private Sub MyTextBox_GotFocus() AutoSelect MyTextBox End Sub Sub AutoSelect(SelObject As Control) SelObject.SelStart = 0 If TypeOf SelObject Is MaskEdBox Then SelObject.SelLength = Len(SelObject.FormattedText) Else If TypeOf SelObject Is TextBox Then SelObject.SelLength = Len(SelObject.Text) End If End If End Sub 捕捉 MouseExit 事件 MouseDown、MouseUp、MouseMove。VB 似乎提供了很好的 Mouse 事件。 但好象还缺少什么!对!还差 MouseExit(鼠标移出)事件。在 VB 中,我 们要捕捉 MouseExit 事件,必须用 API 函数: Private Declare Function SetCapture Lib &user32& (ByVal hWnd As Long) As LongPrivate Declare Function ReleaseCapture Lib &user32& () As Long 然后,我们可以在控件(以 Picture1 为例)的 MouseMove 事件上加上以下代码: Dim MouseExit As Boolean MouseOver = (0 &= X) And (X &=&Picture1.Width)& And (0 &=&Y)& And (Y &=&Picture1.Height)&Br&& If MouseExit Then ??.. SetCapture Picture1.hWnd Else ??.. ReleaseCapture End If 如何让文本框输入完后,直接跳入下一行? 我们在编制程序的时候,特别是数据库软件,经常会遇到这样一个问题: 在文本框中输入完后,用户习惯性的按下回车键。但是系统“嘀”的一声, 并没有象想象那样跳入下一行或者其他的什么。那么能不能让程序在输入完 后干其他的事呢?试一试下面的代码吧。 Sub Text1_keyPress(KeyAscii As Integer) If KeyAscii=13 Then SendKeys&{tab}& End If End Sub 如何强制文件对话框再次读取正确的磁盘? 如果构造了一个以通用对话框为模型的简单对话框(通常应使用通用对话框 的 OCX),会发现再次选择软盘驱动器并不实际.再次读盘,改变到 C 盘,并再次选择 A 盘.只是使它读新软盘中的目录. 为了解决这个问题,在一个按钮的代码段中加入以下代码: drive1.refresh dir1.refresh file1.refresh VB6.0 的 OPEN 对话框控件图示功能扩充 Visual Basic For Windows(VB)提供了丰富的控件,但其提供的公用 对话框控件在打开文件时(例如*.Bmp 和*.Pcx 等)不能显示文件内容即图 像,本文给出了一个实例,可以模拟一些图形软件包在打开文件的同时显示图 像,模拟和扩充 OPEN 控件功能。 为模拟的扩充 OPEN 功能,下面给出了一个完整的 VB 程序,实现方法如下: 一、建立窗体 首先建立一个窗体(窗体名为 OPNFILE) ,窗体上包含驱动器列表、目录 列表、文件列表、两个命令按钮(确认、取消)和显示影像的控件(picture 或 image) , 下面是这 6 个控件的建立方法和有关属性的改变。 1、DirvelistBox 驱动器列表控件 双击驱动器列表控件,在窗体上调准控件的位置,控件名称为“Drive1” 。 2、DirlistBox 目录列表控件 双击目录列表控件,在窗体上调准控件的位置,控件名称为“Dirl” 3、FilelistBox 文件列表控件 双击文件列表控件,在窗体上调准控件的位置和尺寸,控件名称为“Filel” , 修改“Pattern”属性为“*.bmp, *.pcx” 。 4、Command Buttom 命令按钮控件 双击命令按钮控件,建立命令按钮,第一个取名为 Command1,修改 Caption 属性为“确认” ,第二个取名为 Command2,修改 Caption 属性为“取消” 。 5、显示影像的控件 既可以选 picture 控件,也可选 image 控件显示图像,以 image 控件为例。双击 image 控件,调准矩形框的大小和位置,取名为 imagel,设置 strtch 属性。 Strech=false 时,图形以原尺寸显示。 二、事件过程的建立 1、驱动器更改事件过程 Sub Drive-change() ①Dirl.Path=Drivel.Drive ②ChDrive.Path= Drivel.Drive End Sub 其中①当驱动器发生更改时,改变目录路径;②更改路径。 2、目录更改事件过程 Sub Dirl change() Filel.Path=Dirl.Path End Sub 该事件过程是对目录发生更改时,作出文件路径更改的响应。 3、文件列表单击事件 Sub Filel-click() Imagel.Picture=loadpicture(Filel.path+”\”+Filel.FileName) End Sub 单击任一图形文件名时,在 image 控件框上显示图像。 4、命令按钮控件 Sub Command1-click() F1$=Filel.Path+”\”+FileName End End Sub Sub Com mand2-click() F1$=” ” End Sub F1$为选择文件名称,供软件使用,若用户单击“取消”按钮,F1$为空串。 单击驱动器名可以改变驱动器,单击目录列表中某一目录可以更改目录,单击 某一图形文件可以显示图形,在文件列表中按“↑”或“↓”键,可以随着文件名 的变化,图像框中的图形也随之发生更改。 F1$可以供应用程序调用,其中包含驱动器名、目录和文件名。 VB6.0 网格中输入数据 VISUAL BASIC 提供的网格控制(Grid)主要是用来直观地输出数据,但不能 输入数据,使用起来很不方便。能不能向网格中输入数据呢?笔者提出了两种解决 方法,供大家参考: 方法一: 改写网格的 KeyPress 事件,在每次有合法字符输入时,把 Grid 的 Text 项和输 入字符连接。这种方法缺点是:一代码较复杂,需要处理各种 ASCII 字符信息; 二是通过编程只能实现很少的编辑功能,如用退格键删除前一字符,用 Del 键删除 所有字符;三是这种方法不能输入汉字,使用起来受到很大的限制。 方法二: 利用一文本框作为缓冲,实现编辑功能。当网格改变行列时,把网格当前行列 的内容传递给文本框;当网格中有 ASCII 字符产生时,把输入焦点设置为文本框, 并把输入的 ASCII 字符送给文本框;当编辑完文本框的内容时,按 Enter 键或 TAB 键, 把文本框的内容送给网格的当前行列,并把输入焦点设置为网格。如下程序所示 (其中 Textl 为文本框,Labell 为标签,Gridl 为网格) : Option Explicit Const EnterAsc=13 Const TabAsc=9 Private Sub Form-Load() Labell.Caption=”请输入” End Sub Private Sub Gridl-KeyPress(KeyAscii As Integer) Text1.StFocus Textl.SelStart=0 If KeyAscii <> EnterAsc And KeyAscii <> TabAsc Then SendKeys Chr (KeyAscii) End IF End Sub Private Sub Gridl-RowColChange() Textl.Text=Grid1.Text End Sub Private Sub Text1-KeyPress(KeyAscii As Integer) If KeyAscii=EnterAsc Then Grid1.SetFocus KeyAscii=0 End If End Sub Private Sub Text1-LostFocus() Grid1.Text=Text1.Text End Sub 如何使 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 等。 防止文本控件中的部分滚动 大家知道,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 消息发送给文本框,再次运行该程 序,这时我们会发现,文本框的下半部分显示不出来,尽管实际上文本仍然是存储在控 件中的。 防止用户编辑文本框控件中的内容 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 控件控制显示不同的图象,形成简单的动画。 在 RichTextBox 之中, 如何将被选取的内容(包含文字及图片) 复制到剪贴簿? 如果不是写程序, 那么就是按下键盘 Ctrl+C。 当 使 用 者 按 下 Ctrl+C 时 , RichTextBox 会 对 自 己 送 出 WM_COPY 的 信 息 , 而 接 着 RichTextBox 的窗口程序收到此一信息时, 便会将被选取的内容(包含文字及图片)复制到剪 贴簿&127;。 所以如果想要将 RichTextBox 中被选取的内容复制到剪贴簿, 只要对 RichTextBox 送出 WM_COPY 信息即可, 以下是程序撰写上的细节: 1. API 函数的声明式: Const WM_PASTE = &H302 Const WM_CUT = &H300 Const WM_COPY = &H301 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 之前加上 Public 保留字, 并且 将 Private 保留字去掉。 2. 调用例: SendMessage RichTextBox1.hWnd, WM_COPY, 0, ByVal 0& 在 ListBox 之中, 如何检测鼠标所在位置的选项? 我们可以利用 ListIndex 属性得知 ListBox 的选项, 但是当鼠标移到某一个选项上面(但还 没有选取),如何得知此一选项呢?方法是对 ListBox 送出 LB_ITEMFROMPOINT 信息, 细 节如下: 1. API 的声明: Const LB_ITEMFROMPOINT = &H1A9 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 之前加上 Public 保留字, 并且 将 Private 保留字去掉。 2. 调用例:(在表单上布置一个 TextBox 及一个 ListBox, 然后利用 MouseMove 事件程序 来检测鼠标所在位置的选项) Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim pos As Long, idx As Long pos = X / Screen.TwipsPerPixelX + Y / Screen.TwipsPerPixelY * 65536 idx = SendMessage(List1.hwnd, LB_ITEMFROMPOINT, 0, ByVal pos) ' idx 即等于鼠标所在位置的选项 If Idx &65536 Then Text1.Text=&List1.List(idx)&Br&& End Sub 在 VB6.0 中使用数据窗体设计器插件 一个插件实际上是一个 OLE 服务器,用于扩展 VB 开发环境,增强 VB 的功能。我们可以使 用插件为 VB 菜单增加定制项,可管理当前激活窗体及控件,并响应多种文件控制事件。VB 在 SAMPLES 目录的 ALIGN、DATAWIZ 和 SPY 子目录下就包含了三个这样的插件应用程序。 这里我们着重讨论 DATAWIZ 下的数据窗体设计器插件。 1.数据窗体设计器插件的引入 通常,我们在使用 VB 数据控件设计数据窗体时,大量的时间都花在窗体的可视化设计过程 上, 如标签和数据装订控件的建立和对齐定位。 我们设想要是能根据数据库结构自动生成数 据窗体,那将是一件非常令人愉快的事情。随着 VB4 的推出,我们将会惊喜地发现,它不 仅提供了实现插件的功能,而且包含了一个实用的数据窗体设计器(Data Form Designer)插 件。 利用该插件瞬间即可生成使用数据控件的简单数据窗体。 但是由于该窗体设计器只是一 个随 VB 发行的示例应用程序,我们必须首先载入该文件,生成 VB 的一个插件,再安装该 插件才能使用。所以 VB 的数据窗体设计器可能还不广为人知,下面将它介绍给 VB 的使用 者,希望能为设计数据窗体提供帮助。 2.载入数据窗体设计器示例文件 如果数据窗体设计器没有出现在可用插件的列表中,则必须载入它,其步骤是: *选择 File|Open Project 菜单命令,打开\Vb\Samples\Datawiz\Dfd.Vbp 项目文件 *选择 File|Make EXE File 命令创建一个可执行文件 *运行该程序,数据窗体设计器自动加入到下一步中要使用的可用插件到列表中 3.安装数据窗体设计器插件 安装数据窗体设计器插件是通过插件管理器完成的,其过程是: *选择 Add-Ins|Add-In Manager 菜单命令 *选取 Data Form Designer,即数据窗体设计器 *单击 OK,则数据窗体设计器出现在 Add-Ins 菜单中 4.使用数据窗体设计器 通过几个简单的步骤就可创建一个查看并编辑库的示例应用程序: *选择 Add-Ins|Data Form De signer 菜单命令,弹出一个数据窗体设计器窗口 *输入窗体名称 *选取一个数据库类型 *单击 Open Database 打开一个数据库 *从 RecordSource 列表中选取相应表 *从 Available Columns 中选取部分或全部字段至 Included Columns 中 *单击 Build the Form 按钮,产生所需要的数据窗体 *数据窗体建立完毕,单击 Close 按钮 *选择 Tools|Options 命令将该窗体设置为启动窗体 *运行该应用程序 5.数据窗体设计器完成的工作 数据窗体设计器为程序开发者创建的可视窗体包括以下的工作: *在窗体上增加一个数据控件,并为其设置 Connect,DatabaseName 和 RecordSource 属性 *对于表中所选的数据库字段,增加一个有字段名的标签和相应的装订控件,装订控件的类 型取决于字段的数据类型: 字段数据类型 装订控件类型 字符串、日期和数值 文本框 布尔 检查框 Memo 域 多行文本框 二进制数据 OLE 包容器 *增加四个命令按钮:增加、删除、刷新、更新和关闭,以执行不同的数据访问功能 为命令按钮和数据控件增加简单的程序代码和注释说明 当然, 使用数据窗体设计器产生的数据访问窗体是非常简单的, 但这个简单的窗体可以作为 在应用程序中建立更复杂的数据访问功能的框架结构。 如何在输入光标进入 TextBox 时,将整个 TextBox 的内容变成反白? 利用 GetFocus 事件(发生于输入游标进入 TextBox 时 )、 SelStart 属性 (表示被选 取区的起 始位置 )、及 SelLength 属性 (表示被选取区的长度 ),程序 如 下 : Private Sub Text1_GotFocus() Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text) End Sub 利用 EM_LINESCROLL 信息控制 TextBox 的卷动。 在含有卷动轴的 TextBox 中, 如何以程序控制 TextBox 的卷动? 传送 EM_LINESCROLL 信息给 TextBox 控制文件, 方法是调用 SendMessage API 函数,细节 如下: 1. API 的声明: Const EM_LINESCROLL = &HB6 Private Declare Function SendMessageBynum Lib &user32& Alias &SendMessageA& (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 注:如果以上的声明放在「一般模块」底下, 应在 Const 之前加上 Public 保留字, 并且 将 Declare 之前的 Private 保留字去掉。 2. 调用范例: ret = SendMessageBynum(Text1.hwnd, EM_LINESCROLL, 0, 1 ) ' 下卷一行 ret = SendMessageBynum(Text1.hwnd, EM_LINESCROLL, 0, -1 ) ' 上卷一行 ret = SendMessageBynum(Text1.hwnd, EM_LINESCROLL, 1, 0) ' 右卷一列 ret = SendMessageBynum(Text1.hwnd, EM_LINESCROLL, -1, 0) ' 左卷一列 ret = SendMessageBynum(Text1.hwnd, EM_LINESCROLL, 1, 1 ) ' 下卷一行且右卷一列 注:以上的 Text1 为 TextBox 的名称。 利用 timeGetTime 更精准地计算时间差。 我想每 0.005 秒做某一件工作, 所以撰写了以下程序: Dim tm1 As Single Do tm1 = Timer While Timer - tm1 &0.005 ' 等于 0.005 秒 DoEvents Wend ?做某一件工作 Loop 但实际上, 在 While 循环里面, Timer 函数几乎每次都得到相同的时间,只有大约隔了 0.05 秒才会得到不同的时间, 也就是说 Timer 的准确性只有 0.05 秒, 但我希望进行的 工作却是每 0.005 秒一次, 该怎么办呢? 可以改用 Windows API 的 timeGetTime 函数, 此一函数会传回 Windows 开机以来所经 过的时间,时间单位是 1/1000 秒, 举例来说, 开机经过 2 分钟, 则传回值等于 2*60*1000, timeGetTime 的优点是时间可以精确到 1/1000 秒, 所以可以用来解决上述 的问题,细节如下: 1. API 的声明: Private Declare Function timeGetTime Lib &winmm.dll& Alias &timeGetTime& () As Long 注:如果以上的声明放在「一般模块」底下, 应将 Declare 之前的 Private 保留字去掉。 2. 程序范例: Dim tm1 As Long Do tm1 = timeGetTime While timeGetTime - tm1 &5 ' 等于 5/& 秒 DoEvents Wend ?做某一件工作 Loop 快速读取 TextBox 第 N 行的资料 TextBox 是以 vbCr+vbLf 为分行符号, 如果我们要逐一读取 TextBox 每一行,无非是寻找 vbCr+vbLf 的所在位置, 然后取出每一行的字串, 不过这个方法真的不快,而且如果我们 要读取第 N 行资料, 还是要从第 1、2、┅N-1 行逐一读起, 实在麻烦。 还好 Windows API 提供有读取 TextBox 第 N 行的功能, 细节如下: 1. API 的声明: Const EM_GETLINE = &HC4 Const EM_LINELENGTH = &HC1 Const EM_LINEINDEX = &HBB 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 Private Declare Sub RtlMoveMemory Lib &KERNEL32& (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) 注:如果以上的声明放在「一般模块」底下, 应在 Const 之前加上 Public 保留字, 并且 将 Private 保留字去掉。 2. 程序范例: Sub TB_GetLine(ByVal hWnd As Long, ByVal whichLine As Long, Line As String) Dim length As Long, bArr() As Byte, bArr2() As Byte, lc As Long lc = SendMessage(hWnd, EM_LINEINDEX, whichLine, ByVal 0&) length = SendMessage(hWnd, EM_LINELENGTH, lc, ByVal 0&) If length & 0 Then ReDim bArr(length + 1) As Byte, bArr2(length - 1) As Byte Call RtlMoveMemory(bArr(0), length, 2) Call SendMessage(hWnd, EM_GETLINE, whichLine, bArr(0)) Call RtlMoveMemory(bArr2(0), bArr(0), length) Line = StrConv(bArr2, vbUnicode) Else Line = && End If End Sub ' 假设要读取 Text1 第 5 行的资料 Dim S As String Call TB_GetLine( Text1.hWnd, 5, S ) ' 传回值 S 即等于到 5 行的资料 注:TextBox 的行次是从 0 起算。 在 VB 中用定时控件实现长定时操作 Timer 控件可用来在一定时间间隔执行操作,然而,一个 Timer 控件的时间间隔取值最大为 64.767 毫秒,这意味着即使最长的时间间隔也不比一分钟长多少(大约 64.8 秒) ,也就是说 一个 Timer 控件只能响应大约一分钟之内的事件。如果要响应长时间的事件,例如,要开发 一个学习系统的自我测试或考试过程, 需要限制一个考试时间, 一般都在10~150分钟, 开始自动计时,时间到报警考试结束。则需多个 Timer 控件配合使用,这样做显得既繁琐又 不实用。其实,可以只用一个 Timer 控件,在其 Timer 过程中使用一个计数器,从而响应任 意长时间间隔的事件。 下面是一个定时实例的部分代码: 控 件 属 性 设置的值 Label1 Caption ″请输入限定时间(分钟) :″ Text1 Text ″& Command1 Caption ″确认″ Timer1 Interval 60000 Enabled False 在窗体通用模块 General 里声明N、T两个变量,N作为计数器,T用来存放限定时间。 DIM N AS Integer DIM T AS String Command1- Click ( ) T=Text1.Text Timer1.Enabled=True?? End Sub Timer1- Timer( N=N+1 if n=val(T) Then Beep )Timer1.Enabled=False End if End Sub 将定时器的 Interval 属性值设为 60000,使得计数器每分钟加1,当然也可以设置为其他的 值,如 1000,这样就使得计数器每秒钟加1,但这样要浪费较多的系统时间。 处理多个具有相同要求的控件 我们往往有时需要处理多个具有相同特性的控件,如:把 100 个 Text 及 Label 的内容加 起来。这时,我们可以使用下面的技巧: 1.如果是同一种类型的控件,我们可以使用控件组达到目标。 2.如果不是同一类型控件,控件组就无法使用,这时,我们还可以利用控件的 Tag 性,我 们可以把每个控件设置一个 Tag 标志。在程序中,我们可以用下面代码来察看是否是我们 需要的控件: For I=0 To Controls.Count-1 If Controls(I).Tag = &MyTag& Then …… Next I 输入限制确认 在某些应用程序中, 我们需要限制在文本框或其它一些控件中只能输入数字或一些特定的字 符,现在我们可以通过下面的一个函数来实现此功能: Function ValiText(KeyIn As Integer, ValidateString As String, Editable As Boolean) As Integer Dim ValidateList As String Dim KeyOut As Integer If Editable = True Then ValidateList = Ucase(ValidateString) & Chr(8) Else ValidateList = Ucase(ValidateString) End If If InStr(1, ValidateList, Ucase(Chr(KeyIn)), 1) & 0 Then KeyOut = KeyIn Else KeyOut = 0 Beep End If ValiText = KeyOut End Function 在工程中加入此函数后,你就可以使用它了。 方法:在需要限制输入的控件的 KeyPress 加入以下代码: KeyAscii=ValiText(Keyascii, &/-&,True) 现在你就可以过虑掉你不希望的字符了。 在此例中, 我们只接受第二个参数提供的字符, 即: &/-& 而此函数的第三个参数就决定了能否使用 [Backspace] 键。 最后值得一提的是此函数对大小 写是不敏感的。 利用 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:\windows\setup.bmp&) Timer1.Interval = 10 I =0 End Sub 7、在时间控件 Timer1- Timer1()事件中进行程序封面的制作工作,演示简单的动画,并 控制此动画运行一段时间后自动停止,关闭程序封面,返回程序主窗口;下面的代码实现在 一个图片上随机显示字符串,显示 30 次字符串后自动退出。 Private Sub Timer1-Timer () Strr1 = &程序封面演示“ With Form2 .Font.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:\windows\setup.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/98 系统下,在 VB5.0/6.0 环境下调试通过。 用 MSGBOX 函数设计版权信息 MsgBox 函数可用来设计简易的版权信息,它只能显示文本,如果要求不高的话可采用它, 优点是非常方便,比如在菜单 ABOUT 项中显示版权信息。 MsgBox 函数的用法如下:MsgBox msg [, [type] [, title] ] msg ―需要显示的文字信息,如版权信息。 Type―按钮显示选择项。 如 0 只显示 OK 按钮(确省选择) 显示 Yes 和 No 按钮 ,4 title―标题文字信息。 MSGBOX 最多能显示 1024 个字符, 超出的将被截去;它可自动换行,如果你想强制换行的 话需要在换行处加入换行符 CHR(10) 。 例子: Sub Form_Click () Msg1 = ” Copyright (c) 1996” & Chr(10) & ”Ver 1.0 ” ’分两行显示 MsgBox Msg1, 0, ”Copyright demo” ’只显示一个 OK 按钮 End Sub 巧用 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&0 Them 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大于1 27的字符,不能正常显示,不能用put语句正常写入文件(得到的只是空格) ,有兴趣 者不妨一试。 在 VB 中使用枚举变量 VB6 引入枚举变量,使用它,我们可以显著地改变应用程序的易读性: Public Enum TimeOfDay Morning = 0 Afternoon = 1 Evening = 2 End Enum Sub Main() Dim RightNow As TimeOfDay If Time &= #12:00:00 AM# And Time &#12:00:00 PM# Then RightNow = Morning ElseIf Time &= #12:00:00 PM# And Time &#6:00:00 PM# Then RightNow = Afternoon ElseIf Time &= #6:00:00 PM# Then RightNow = Evening End If End Sub 防止自身多次运行 由于 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 格式化输入 在数据输入过程中,有些数据要求一定的格式,比如限制输入的只能为数字或英文字符,这 可用 VB 的格式输入文本框来实现。它与文本框(TEXT BOX)功能基本相似,但多了一个 MASK 属性,MASK 属性常用的设定如下: #―限定仅能输入数字 0~9; A― 限定输入为英文字符及数字; ?―限定仅能输入英文字符; .―限定小数点位置; :―限定时间分隔号; /―限定日期分隔号 不需编写代码,只要在设计时将格式化文本框对象(MASKED EDIT)的 MASK 属性设计好所 需格式即可。比如 ## - ## - ## 可输入 12-11-96。 使用 IIF 和 SWITCH 以精减代码 在很多地方你都可以使用一个更紧凑的 Iif 函数来代替 If?Else?Endif 的结构: 例:返回 两个值中较大的一个 maxValue = Iif(first &= second, first, second) Switch 则是一个很少使用的函数,可是在很多方面它都提供比 If?ElseIf 结构更好的 例: 判断 &x& 是正、负还是 null? Print Switch(x&0,&负&,x&0,&正&, 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 中 可用如下的事件驱动代码: sub text1_getfocus() text1.Selstart=0 ’选择起始位置 text1.Sellength=65000 ’选择长度 end sub sellength 接近文本框允许的最大长度(65535) ,这样做是为了 强迫 VB 使用文本的实际长度。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、 C、 分别等于 0、 Null、 Empty、 B、 D &&、 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。 利用 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 &128 Then ' 英文 N=N+1 Else ' 中文 N=N+2 End If Next 看起来程序有点罗唆, 如果您不喜欢这个方法, 可以使用 Windows API 的 lstrlen 函数, 假设假计算 S 的长度, 则 API 声明式如下: Private Declare Function 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 程序判断中英文字然后计算长 度来的快。 如何传递不固定个数的叁数? 定义副程序时, 我们必须把叁数一一列出来, 例如: 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 函数。 避免按 [ENTER] 键产生的“嘀”声 当你在文本框(Text Box)中输入完信息然后按 [Enter] 键,你就会听到计算机喇叭发出难 听的“嘀”声。 你可以通过以下方法避免此声: 假设文本框为 Text1,在 KeyPress 事件中输入以下代码: Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = Asc(vbCr) Then KeyAscii = 0 End If End Sub 当你运行程序后,按 [Enter] 键就再也不会听到那难听的声音了。 VB 剪贴板的用法 VB 中剪贴板的应用是很重要的,它能使你简化程序并能增强程序功能。下下面就把常用的 几个用于 VB 剪贴板的语句作一介绍: 一、CLEAR(, ,STACK&) 用于关闭文件,清除文件缓冲区的内容和其它一些设置初始值的工作。其中 STACK&为设置 堆栈大小。 二、CLIPBOARD.GETDATA( [FORMAT] ) 从剪板中返回一个图片。其中 FORMAT 的值有 2、3、8、9 具体对应请参照文末的表格。 三、CLIPBOARD.GETFROMAT(FORMAT) 返回 TRUE&FALSE,指示剪贴板中是否是指定的格式。其中 FORMAT 的值有 1、2、3、8、9、 & HBF00 几项。 四、CLIPBOARD.GETTEXT( [FORMAT] ) 从剪贴板上返回一串文本。FORMAT 的值可以是 1、&HBF00,如果没有所要的字串则返回 一个空 串“” 。 五、CLIPBOARD.SETDATA DATA[,FORMAT] 在剪贴板一使用指定格式放置一个图片。DATA 是放在剪贴板上的图片;FORMAT 可以是如 下值 之一:2、3、8、9。 六、CLIPBOARD.SETTEXTDATA[,FORMAT] 在剪贴板中使用指定格式的一个文本串。DATA 是要放入剪板的文本数据;FORMAT 可选值 为:1、 &HBF00。 注:0 为自动适应格式(缺省格式) 动态改变屏幕设置 我们经常看到许多 Win95/98 的应用程序(尤其是游戏)在运行它的时候改变屏幕的设置, 运行完后恢复,在 VB 中,我们可以用以下方法实现: 定义 Private Declare Function lstrcpy _ Lib &kernel32& Alias &lstrcpyA& _ (lpString1 As Any, lpString2 As Any) _ As Long Const CCHDEVICENAME = 32 Const CCHFORMNAME = 32 Private Type DEVMODE dmDeviceName As String * CCHDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCHFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type Private Declare Function _ ChangeDisplaySettings Lib _ &User32& Alias &ChangeDisplaySettingsA& (_ ByVal lpDevMode As Long, _ ByVal dwflags As Long) As Long 函数 Public Function SetDisplayMode(Width As _ Integer,Height As Integer, Color As _ Integer) As Long Const DM_PELSWIDTH = &H80000 Const DM_PELSHEIGHT = &H100000 Const DM_BITSPERPEL = &H40000 Dim NewDevMode As DEVMODE Dim pDevmode As Long With NewDevMode .dmSize = 122 If Color = -1 Then .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Else .dmFields = DM_PELSWIDTH Or _ DM_PELSHEIGHT Or DM_BITSPERPEL End If .dmPelsWidth = Width .dmPelsHeight = Height If Color && -1 Then .dmBitsPerPel = Color End If End With pDevmode = lstrcpy(NewDevMode, NewDevMode) SetDisplayMode = ChangeDisplaySettings(pDevmode, 0) End Function 例子调用:改变为 640x480x24 位: I = SetDisplayMode(640, 480, 24) 如果成功返回 0 。 在 VB 中显示动画鼠标图标 Win95/98 的动画鼠标为应用程序增色不少, VB 则只提供一般的鼠标图标支持。 而 要用 VB 显示动画鼠标形状,你可以使用以下方法: 函数声明: Public Const GCL_HCURSOR = -12 Declare Function ClipCursor Lib &user32& (lpRect As Any) As Long Declare Function DestroyCursor Lib &user32& (ByVal hCursor As Any) As Long Declare Function LoadCursorFromFile Lib &user32& Alias &LoadCursorFromFileA& (ByVal lpFileName As String) As Long Declare Function SetClassLong Lib &user32& Alias &SetClassLongA& (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetClassLong Lib &user32& Alias &GetClassLongA& (ByVal hwnd As Long, ByVal nIndex As Long) As Long 使用: Dim mhBaseCursor As Long, mhAniCursor As Long Dim lResult As Long mhAniCursor = LoadCursorFromFile(&c:\windows\cursors\appstart.ani&) lResult = SetClassLong((hwnd), GCL_HCURSOR, mhAniCursor) 用 VB 将命令行软件 Windows 化 有很多深受欢迎的软件,如 ARJ,UNDISK 等都是在 DOS 环境下以命令行的形式出现的。其特 点就是依靠大量的参数和开关变量来实现其丰富的功能。利用 Visual Basic 可以简单地把此 类软件改写成 WINDOWS 版本,其中大量的开关参数可用菜单、列表框、组合框和复选框等 一一映射成图形界面。而命令的调用。可以用 VB 提供的 SHELL 函数,其语法为: shell(命令字符串[,窗口风格]) 如以下 VB 小程序: Sub Command3D1_Click () Dim x x = Shell(&c:\tools\arj.exe a a:\demo c:\demo\*.*&) End Sub 但使用 SHELL 函数 会出现 WINDOWS 界面和 DOS 黑色界面的突然切换,显得不美观。如何 解决这个问题呢?使用 WINDOWS 的 API 函数 WinExec,可以在隐含的窗体中启动应用程序, 使命令行程序完全在后台执行。下面给出一例,将 ARJ 完全 WINDOWS 化,其效果完全可以 乱真。 Sub Command1_Click ( ) Dim cmd As String Dim hWnd As Integer cmd = &c:\dos\ARJ.pif & & list1.Text & & -& & LIST2.Text & & & & text2.Text & & & & text1.Text ’list1、 list2 输入参数,text1,text2 输入文件路径 hWnd = WinExec(cmdline, 0) ’参数为 0 则隐藏窗体 If HWND &32 Then ’hWin&32 则启动应用程序失败 MsgBox &error!& Exit Sub End If While GetModuleUsage(HWND%) mousepointer = 11 ‘鼠标呈沙漏状 WAIT% = DoEvents() Wend mousepointer = 1 ’鼠标复原为箭头 End Sub 在此例中,笔者使用了 WINDOWS 的 PIF 编辑器将 ARJ.EXE 编辑成 ARJ.PIF,是因为类似 ARJ 这 样的软件是以全屏方式执行的,而 WINEXEC 函数只能隐藏以窗体方式运行的程序。在编辑 PIF 文件时显示方式选择“窗口” ,执行方式选择“后台” ,这样就解决了上面提到的界面突 换的问题。而调用 API 函数 GetModuleUsage 以获得应用程序结束的标志,若运行完毕则返 回 TRUE,若未运行完毕则让出 CPU 控制权,为运行 ARJ 提供时机。 这样的小程序完全可以实现命令行软件的 WINDOWS 化,而且运行起来真假难辨,有兴趣的 读者不妨试一试。 怎样在 VB 中控制 WORD 使用 VB 编程时,有时需要调用 Microsoft Word 对文字进行编辑、排版及输出。为实现这种 调用,可以使用 Shell 函数、OLE 自动化、在包容器中嵌入 Word 对象等方法。经过试用和比 较,总结出了这几种方法的各自特点。 1 使用 Shell 函数直接调用 语法:Shell (pathname[,windowstyle]).Pathname 是指要执行的程序的名字和任何必须的参数 或命令行开关,可以包括目录和驱动器名;Windowstyle 是执行程序的窗口风格的数字。 使用 Shell 调用 Word 比较简单, 编程量小, 但必须明确指定 Word 所在路径, 这不利于移植, 而且,不能对 Word 进行控制,不利于程序和 Word 之间的数据交换。 2 使用 OLE 自动化控制 Microsoft Word 2.1 使用方法 (1)Word 为 OLE 自动化提供一种称为“Basic”的对象,要在 VB 中控制 Word ,首先要定义一 个引用 Word 中“Basic”对象的对象变量:Dim Wordobj as Object (2)将 Word 中的“Basic”对象赋给该对象:Set Wordobj=CreateObject(&Word.Basic&) (3)可以使用大多数 WordBasic 语句和函数控制 Word 或 Word 文档,使用方法和在 Word 宏 中使用 WordBasic 指令的方法基本相同。 (4)关闭 Word:Set Wordobj =Nothing。 注意: “Basic”对象不支持关闭它自己的一个方法。即若在 OLE 自动化中关闭了 Word,则 对象被置为 Nothing,便不能再对对象进行操作,程序出错。 2.2 VB 指令与 WordBasic 指令的差异 (1)有一些语句和函数不能使用,包括:控制结构,如 While?Wend 和 If?Then?Else;声明 语句,如 Dim;定制对话框相关的语句:FileExit 语句;要求数组变量作为参数的语句或函 数。 (2)也有一些指令使用方法不同。①返回字符串以一个美元符($)结束的 WordBasic 函数的 关 键 字 必 须 括 在 方 括 号 中 。 例 如 , 在 WordBasic 宏 中 的 GetBookmark$() 语 句 : mark$=GetBookmark$(&Address&) , 若 用 VB 调 用 , 必 须 这 样 写 mark$=Wordobj.[Ge-tBookmark$](&Address&)。 ②选择一个命令按钮用 “True” ,不选择用 “False” 2.3 对 OLE 自动化的说明 Word 可以为 OLE 自动化给另一个应用提供对象,但是它不能使用 OLE 自动化访问其它应用 中的对象。例如:VB 和 Excel 可以使用 OLE 自动化访问 Word,但是 Word 不能使用 OLE 自 动化访问它们。 3 在包容器中嵌入 Word 对象 在 VB 中,要访问在包容器中嵌入的 Word 对象,首先要在项目中插入对象。做法如下:在 窗体中插入 OLE 控件,对象类型选择“MicrosoftWord 图片”或“Microsoft Word 文档” ,再 按“确定” 。 然后用 Object 属性访问文档或图片, 并使用 WordBasic 语句和函数作用于它。 嵌入的对象必 须在可被访问之前被激活,可以使用 Action 属性激活 OLE 控件。例如,使用下面指令访问 一个嵌入在称为 OLE1 的 OLE 控件中的文档: Dim Wordobj as Object OLE1.Action =7 Set Wordobj =OLE1.Object.Application. WordBasic 其他方面,使用方法同 OLE 自动化。使用在包容器中嵌入的 Word 对象,Word 显示的窗口 大小、位置与 OLE 控件定义的大小、位置相同,而且工具栏显示位置与 Word 脱离。这一点 与 OLE 自动化相比,是个不足。 总之,要想在 Microsoft Visual Basic 中控制 Microsoft Word,最好使用 OLE 自动化,通过使 用 WordBasic 指令对 Word 进行全面控制,而且,用户使用起来与使用 Microsoft Word 一样, 非常方便。 用 VB 制作 Windows 风格安装盘 使用 VB 中的“安装大师” (Setup Wizard)可以制作出高水平,标准的“Windows 式”安装 盘。VB 制作安装盘步骤如下: 1、在制作安装盘前必须关闭并退出 VB 环境,然后执行 Setup Wizard。 2、安装开始,要求用户选择项目文件。屏幕中的 Project file 文本框可键入所要制作安装的 应用项目,后缀名为 MAK 文件,也可按 Select MAK file 按钮来选择项目文件。 3、选中 Next 按钮,屏幕显示选择需要在安装盘中包含对应功能的附加文件。 4、按 Next 按钮,弹出对话框,供用户选择软盘类型及驱动器设置。 5、按 Next 按钮,屏幕提供选择加入或删除的文件。 6、按 Next 按钮,Setup Wizard 首先检查硬盘中是否有足够的空间存放临时文件,然后进入 DOS 环境,压缩所需文件,重新调用 VB 建立 Setup.exe 文件。 7、屏幕提示将压缩好的程序及文件装入格式化好的空软盘中。 至此,你的安装盘便大功告成,在安装盘中包含了 Setup.exe 文件和压缩后的项目文件与附 加文件以及 VBRUN300.DLL 文件等。在制作安装盘过程中应注意以下几个问题: 1、VB 所提供的 Setup Wizard 只能制作用 VB 编写的程序,并且在制作前,应检查项目文件 是否包含所有需要用的附加功能,否则制作出的安装盘缺某一个文件,就无法运行程序,还 要返工重新制作。 2、所选项目文件中的所有表单文件、程序代码文件都应该存成 ASCII 文本格式。 3、 在步骤 2 之中, 可选择屏幕上的 Rebuiled the Project's EXE file 检查框, 便可自动将 MAK 文件生成 EXE 文件。 4、用活 Save Template 和 Open Template 按钮。这两个按钮分别用来储存及打开.VBZ 文件, 由于制造安装盘有许多步骤, .VBZ 文件就是用来记录这些步骤的,如果能够读入以前储存 的.VBZ 文件就可以连续跳到某一步骤去修改,不必每次都从头一步步地设置,可以大大提 高效率。 当要用安装盘安装应用程序时, 可以在 Windows 环境下运行 Setup.exe 文件将软件解压安装 在硬盘上。当然,如果你想使你的安装盘具备安装应用程序特定部分的功能,这时,就需要 使用 VB 提供的“安装工具” (Setup Toolkit) ,它在 VB 的\Setupkit 子目录之中。 VB 安装程序的汉化 在用 Visual Basic 编写好自己的应用软件后,通常需要一个安装程序来安装它。VB 本身提供 了几种方法,一是使用“应用程序安装向导” (Application Setup Wizard) ,二是修改 VB 提供 的安装示范程序 Setup.EXE (该程序的工程文件及源代码在 VB\SETUPKIT\Setup1) 子目录下) 。 第一种方法生成全是英文提示的安装程序。 而如果采用第二种方法, 软件开发人员不但可以 将全部的安装信息汉化, 而且还可以根据自己的需要对此程序进行修改达到特定的目的, 例 如加密、检查产品序列号等等,因此更为灵活。 在 VB3.0 中,修改英文提示信息只需要在窗体代码中找到各个字符串,然后将其改为中文就 可以了,但是在 VB4.0 中,源代码中并没有直接使用英文字符串,而是用 VB4.0 中新提供的 字符串资源加载函数 LoadRESString 将定义在 Setup1*.RES(16 位版本为 Setup116.RES,32 位版本为 Setup132.RES)中的字符串资源加载到程序中。这样做的最大好处就是当需要对字 符串的内容进行改变时,只修改资源文件即可,无需修改程序源代码。因此我们只需要将该 资源文件的全部英文字符串修改为中文就能够达到汉化的目的了。 问题在于 VB4.0 中并没有提代可修改字符串资源文件(*.RES)的程序,为了编辑该文件, 我们必须找一个资源编辑器,例如 Visual C++中提供的 AppStudio 或者 Borland C++中的 RESourcesWorkShop。 用资源编辑器将 Setup1*.RES 文件打开后, 用中文替换掉所有的英文信 息,然后保存就可以了。在替换中需要注意的是,凡是含有“ {Title} ”的部分不要改变,因 为这一部分用来显示安装标题, 它相当于一个变量, 对于安装不同的应用程序有不同的内容。 经过对字符串资源文件这样的修改,在运行 Setup 程序时你就能看到漂亮的中文安装界面 了。而你甚至不需要对源代码做任何修改,重新生成 EXE 文件后,整个汉化过程就全部完成 了。 &?编译 VB 程序时不要自动使用快速代码优化 如果你第一次使用 VB 的本地代码优化选项,你可能会立即尝试选择“优化代码选项” 。可 是,你知道吗?这样做并不一定保证使你的程序得到最佳性能。 除非你拥有大量内存, 不然程序的性能优化一般不会运行很快。 因为这将导致程序装载速度 缓慢,在内存不足的机器上特别明显,这样“优化代码选项”就可能让你的用户觉得好象比 “优化大小选项”还慢。 基于以上原因,你可以考虑用 P 代码编译你的程序,特别是大型的、UI 和数据库加强的程 序。本地“优化代码选项”所获得的性能并不一定可以弥补程序增长大小后带来的问题。 要决定你到底适合那种编译方式,请使用 VB 企业版上的 Application Performance Explorer (APE) 。 避免装载多份应用程序 你的程序可能只支持单一用户,那么怎么来避免多用户同时使用它吗? 你可以利用 App 对象的 PrevInstance 属性来轻易达到你的目的。 我们可以在程序打开时加入以下代码来验证: If App.PrevInstance Then MsgBox (&程序已经运行,不能再次装载。&), vbExclamation Unload Me End If 让 VB 程序启动快一点 是否觉得你的应用程序启动得太慢了?你可以用下面小技巧让你的程序启动起来感觉快一 点。 在你的启动窗口的 Form_Load 事件的第一行加入下面一行代码: Me.Show VB 在窗口显示前一般先执行 Form_Load 事件中的程序,如果你在 Form_Load 中加入大量 代码,就可以导致 VB 执行代码很久而不显示窗口,我们在 Form_Load 事件的第一行强制 加入 Me.Show 让窗口先显现出来。这样给人感觉程序运行好象就快了点。 显示程序的版本 如果你想在程序的“关于??”中显示程序的版本(以标准方式显示:即 x.xx.xxxx) ,你可 以使用以下子程序: Public Function GetMyVersion() As String Static strMyVer As String If strMyVer = && Then strMyVer = Trim$(Str$(App.Major)) & &.& & Format$(App.Minor, &##00&) & &.& Format$(App.Revision, &000&) End If GetMyVersion = strMyVer End Function 在 Visual Basic 中显示动态运行进度 在安装 WINDOWS 应用程序时,常有状态条来动态显示安装的进度。这种动态显示程序运行 进度的方法在 WINDOWS 许多应用程序中都有应用。 这项技术在 WINDOWS 应用程序开发中 有其重要地位。它表示一种过程的指示。WINDOWS 规定:当一个操作需 2~3 秒时,而用 户在此操作完成前无法继续操作时,应在不可访问窗口上显示沙漏光标,示意用户等待。若 这一操作持续更长的时间, 则应使用动态显示的时间指示器。 并有完成的进度百分比, 暂停、 恢复和取消等按钮以及其他提示信息。用 Visual Basic 实现这一功能是极其简单的,其方法 有二。列举如下: 1. 使用图片框 Picture Box。 用一简单的循环语句控制图片框的宽度增长, 即可显示动态增长过程。 可再加一个文本框以 显示提示信息。一个简单的示例如下: Form1: Caption:进度显示器 Picture1: backcolor: RGB(255,0,0) Width: 1 borderstyle: 0 text1: borderstyle: 0 Sub Form_Load ( ) Picture1.Width = 1 End Sub Sub Form_Click ( ) For I = 1 To 1000 Text1.Text = Int(I / 10) & & & & &%& Picture1.Width = I Next I End Sub 这样就可获得用百分比表示的进度指示器。 2.使用专业版 VB 中的三维面板 3D Panel Control 首先要用 VB 菜单中的 File―Add File?的命令将 Threed.vbx 文件从 WINDOWS 的 SYSTEM 目 录中加到当前工具箱中来, 这样你会发现工具箱中出现了一系列的三维工具。 其中三维面板 3D Panel Control 具有动态显示进度的功能。有关此功能的属性有: FloodColor 设置面板的颜色以区别与背景色; FloodType 表示动态显示的方式。各参数的意义如下: 0 没有状态条进行显示; 1 面板中将用 FloodColor 颜色从左到右递增显示变化状态; 2 面板中将用 FloodColor 颜色从右到左递增显示变化状态; 3 面板中将用 FloodColor 颜色从上到下显示变化状态; 4 面板中将用 FloodColor 颜色从下到上显示变化状态; 5 面板中将用 FloodColor 颜色以圆形从中心向外扩展显示变化状态; FloodShowPct 设定在状态显示中是否显示百分比的变化。设为 TRUE 则表示显示百分比。 FloodPercent 设置或返回百分比的数值显示,仅在程序中设置,设计中无效。 下面给出一个简单的例子,当单击按钮时,面板就动态显示百分比变化: Form1: caption: 进度显示 Command1: caption: 安装 panel3d1: BevelInner = 1 BevelOuter = 2 BevelWidth = 2 ShadowColor = 1 FloodType = 1 FloodShowPct = True FloodColor = RGB(0, 0, 255) Sub Form_Load ( ) panel3d1.BevelInner = 1 panel3d1.BevelOuter = 2 panel3d1.BevelWidth = 2 panel3d1.ShadowColor = 1 End Sub Sub Command1_Click () For I = 0 To 100 panel3d1.FloodType = 1 panel3d1.FloodShowPct = True panel3d1.FloodColor = RGB(0, 0, 255) panel3d1.FloodPercent = I Next I End Sub 这样就生成了一个以百分比显示进度的指示器, 其三维界面标准而美观, 通过用程序控制三 维面板的 FloodPercent 属性,可以设计出更加符合 WINDOWS 标准的安装界面,将它应用到 自己开发的 WINDOWS 应用程序中,一定会为自己的应用程序增色不少。 使用 Win98 的动画光标 在 Windows 9X 系统中具有一个 Windows 3.x 所不具备的特性――支持动画的光标文件。你 可以在 Windows 95 目录中的 Cursors 子目录下看到这些动画的光标文件,它们均具有扩展 名*.ANI。在程序中使用相应的动画光标能够极大地改善程序的外观,本文介绍了如何在你 的 Visual Basic 应用程序中使用 Windows 95 所附带的动画光标文件。 使用动画光标文件 要在 Visual Basic 的应用程序中使用 Windows 95 所附带的动画光标,你需要使用下列 Windows 应用程序编程接口(API)函数: LoadCursorFormFile,用于从磁盘上载入光标文件; ClipeCursor,用于将光标限制在一个固定的矩形区域内; GetWindowRect,用于获取该矩形区域,在下面的样例程序中就是程序主窗体的本身; SetClassLong,用于设置和提取窗口类的数据,以使光标被显示在窗体上; GetClassLong 函数,在退出应用程序之前,需要将应用程序的缺省光标设置回程序执行以前 的光标, 所以需要在程序运行时首先对以前的光标状态进行备份, 这项工作由该函数来完成; DestroyCursor,在正确显示了光标之后,需要使用该函数来取消载入的光标。 样例程序 下面的样例程序将在窗体区域内显示出 C:\WIN95\CURSORS 目录下的 APPSTART.ANI 动画光标 文件,如果你的 Windows 95 路径不同的话,你需要修改样例程序以正确显示出动画光标。 在 Visual Basic 中开始一个新的工程,采用缺省的方法建立 Form1。 在 Form1 上创建一个命令按钮控件,采用缺省的方法建立 Command1。将它的 Caption 属性 设置为“显示动画光标” 。 在 Form1 上创建第二个命令按钮控件,采用缺省的方法建立 Command2。将它的 Caption 属 性设置为“恢复缺省光标” 。 创建一个新的模块,采用缺省的方法建立 Module1.Bas。将如下的声明,类型和常量语句添 加到 Module1.Bas 的通用声明部分中: Option Explicit Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Const GCL_HCURSOR = (-12) Declare Function ClipCursor Lib &user32& (lpRect As Any) As Long Declare Function DestroyCursor Lib &user32& (ByVal hCursor As Long) As Long Declare Function LoadCursorFromFile Lib &user32& Alias &LoadCursorFromFileA& (ByVal lpFileName As String) As Long Declare Function GetWindowRect Lib &user32& (ByVal hwnd As Long, lpRect As RECT) As Long Declare Function SetClassLong Lib &user32& Alias &SetClassLongA& (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetClassLong Lib &user32& Alias &GetClassLongA& (ByVal hwnd As Long, ByVal nIndex As Long) As Long 注意上面的声明语句需要书写在一行内。 将如下的语句添加到 Form1 的通用声明部分中: Option Explicit Dim mhBaseCursor As Long Dim mhAniCursor As Long 将如下的代码添加到 Form1 的 Form_Load 事件中: Private Sub Form_Load() Dim lResult As Long mhBaseCursor = GetClassLong((Me.hwnd), GCL_HCURSOR) End Sub 将如下的代码添加到 Command1 的单击事件中: Private Sub Command1_Click() Dim lResult As Long Dim RT_FormArea As RECT mhAniCursor = LoadCursorFromFile(&c:\win95\cursors\appstart.ani&) lResult = SetClassLong((Me.hwnd), GCL_HCURSOR, mhAniCursor) lResult = GetWindowRect((Me.hwnd), RT_FormArea) lResult = ClipCursor(RT_FormArea) End Sub 将如下的代码添加到 Command2 的单击事}

我要回帖

更多关于 请点击输入图片描述 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信